{ lib, pkgs, config, ... }@inputs:

let
  extra = ../extra;
  scripts = ../scripts;
  changebrightness = pkgs.writeShellScript "changebrightness"
    (builtins.readFile "${scripts}/changebrightness.sh");
  mod = "Mod4";
  shutdownMenu = pkgs.writeShellScript "shutdownmenu"
    (builtins.readFile "${scripts}/shutdownmenu.sh");
  backgroundImage = "${extra}/kuwaitboat.jpg";
  multiTouchGesturesConfig = ''
    bindgesture swipe:4:up focus parent
    bindgesture swipe:4:left workspace prev
    bindgesture swipe:4:right workspace next
    bindgesture swipe:3:up focus up
    bindgesture swipe:3:down focus down
    bindgesture swipe:3:left focus left
    bindgesture swipe:3:right focus right
  '';
in {
  wayland.windowManager.sway = {
    enable = true;
    config = {
      terminal = "${pkgs.lib.getExe inputs.config.defaultPrograms.terminal}";
      modifier = mod;
      fonts = {
        names = [ "Rubik" ];
        style = "Regular";
        size = 12.0;
      };
      input = {
        "type:touchpad" = {
          natural_scroll = "disabled";
          dwt = "disabled";
          click_method = "clickfinger";
          scroll_factor = "0.5";
        };
        "type:keyboard" = {
          xkb_layout = "ca,ca";
          xkb_variant = ",eng";
        };
      };
      window = {
        border = 2;
        titlebar = true;
      };
      keybindings = let
        screenshotPath =
          "Pictures/Screenshots/screenshot`date +%Y%m%d%H%M%S`.png";
      in lib.mkOptionDefault ({ # Screenshot keybinds
        "Print" =
          "exec grim - | wl-copy && wl-paste > ${screenshotPath}"; # Take screenshot of whole screen, save it, and copy it to clipboard
        "Shift+Print" = ''
          exec swaymsg -t get_tree | ${pkgs.lib.getExe pkgs.jq} -r '.. | select(.focused?) | .rect | "\(.x),\(.y) \(.width)x\(.height)"' | grim -g - | wl-copy && wl-paste > ${screenshotPath}''; # Take screenshot of current window, save it, and copy it to clipboard
        "Ctrl+Print" =
          "exec grim -g \"`slurp`\" - | wl-copy && wl-paste > ${screenshotPath}";
      } // rec { # Function Media Keys
        XF86MonBrightnessUp = "exec bash ${changebrightness} 1";
        XF86MonBrightnessDown = "exec bash ${changebrightness} -1";
        XF86AudioMute = "exec wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle";
        "${mod}+XF86AudioMute" =
          "exec wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle";
        XF86AudioRaiseVolume = "exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.05+";
        XF86AudioLowerVolume = "exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.05-";
        "${mod}+XF86AudioRaiseVolume" =
          "exec wpctl set-volume @DEFAULT_AUDIO_SOURCE@ 0.05+";
        "${mod}+XF86AudioLowerVolume" =
          "exec wpctl set-volume @DEFAULT_AUDIO_SOURCE@ 0.05-";
        "${mod}+Shift+e" = null;
        XF86AudioMedia =
          "dunstctl set-paused toggle; dunstify -a 'dunst_mute_key' -u low -h string:x-dunst-stack-tag:dunst_mute_key  'Notifications mute toggled'";
        XF86PowerOff =
          "exec DMENU_COMMAND='rofi -dmenu -prompt=\"Sélectionnez :\"' bash ${shutdownMenu}";
        "${mod}+Pause" = XF86PowerOff;
      } // {
        "${mod}+space" = ''input "*" xkb_switch_layout next'';
        "${mod}+Shift+l" = "exec swaylock -f";
        "${mod}+Home" = "move workspace to output left";
        "${mod}+End" = "move workspace to output right";
      } // lib.attrsets.mergeAttrsList (map (n: {
        # Change focus between workspaces
        "${mod}+${n}" = "exec swaysome focus ${n}";
        # Move containers between workspaces
        "${mod}+Shift+${n}" = "exec swaysome move ${n}";
        # Focus workspace groups
        "${mod}+Alt+${n}" = "exec swaysome focus-group ${n}";
        # Move containers to other workspace groups
        "${mod}+Alt+Shift+${n}" = "exec swaysome move-to-group ${n}";
      }) (map toString (lib.lists.range 0 9)) ) // {
        "${mod}+o" = "exec swaysome next-output";
        "${mod}+Shift+o" = "exec swaysome prev-output";
        "${mod}+Alt+o" = "exec swaysome workspace-group-next-output";
        "${mod}+Alt+Shift+o" = "exec swaysome workspace-group-prev-output";
      } // { });
      # menu = "j4-dmenu-desktop --no-generic --term=${
      #     terminal
      #   } --dmenu='${dmenuCommand}'";
        menu = "${pkgs.lib.getExe config.programs.rofi.package} -modes \"drun,run\" -show-icons -show drun";
      focus.followMouse = false;
    };
    extraConfig =
      ''
        output 'eDP-1' scale 1.50
      '' + # Fractional scaling to 1.50
      ''
        output 'DP-10' pos 0,0
        output 'DP-9' pos 1920,0 transform 270
      '' + # CTF Docking Station Monitors
      ''
        exec gammastep-indicator
      '' + # gammastep-indicator enables red shift
      ''
        exec dunst
      '' + # Enable notifications
      ''
        exec "activate-linux -c 0.5-0.5-0.5-0.5"
      '' + # Enable Activate Linux
      multiTouchGesturesConfig + # Multi-touch touchpad gestures
      ''
        exec swaybg -i ${backgroundImage}
      '' + # Background image
      ''
        focus_on_window_activation focus
      '' + # Focus on window activation lol
      ''
        set $laptop eDP-1
        bindswitch --reload --locked lid:on output $laptop disable
        bindswitch --reload --locked lid:off output $laptop enable
      '' + # Clamshell mode
      ''
        exec swaysome init 1
      '' +
      "";
  };

  programs.rofi = {
    enable = true;
    font = "Rubik 12";
    package = pkgs.rofi-wayland;
    theme = "android_notification";
  };

  home.packages = with pkgs;
    [ swaybg bemenu j4-dmenu-desktop swaysome ] ++
    [ brightnessctl grim slurp wl-clipboard wdisplays ] ++
    [];
}
