{ pkgs, config, ... }:
{
  wayland.windowManager.sway.config = let
    # Set default modifier and variables
    primeMod = "Mod4";
    secMod = "Mod1";
    resizeAmount = "55";
    sendNotif = "notify-send --expire-time=1500";
  in {
    # Hotkeys
    modifier = "${primeMod}";
    keybindings = let
      # Define scripts specific to Sway
      pinWindow = pkgs.writeScript "pin-window" ''
        # Get the current border style of the focused window
        current_style=$(swaymsg -t get_tree | jq -r '.. | select(.focused?).border')

        # Toggle between "normal" (default) and "pixel ${config.look.border.string}" border styles
        if [ "$current_style" == "none" ]; then
          swaymsg "sticky disable, border pixel ${config.look.border.string}"
        else
          swaymsg "sticky enable, border none"
        fi
      '';

      # Kill a window or probe it for info
      swayTools = pkgs.writeScript "swaytools" ''
        # List the app name and whether or not it uses wayland
        swayprop() {
          selected_window=$(swaymsg -t get_tree | jq -r '.. | select(.pid? and .visible?) | "\(.rect.x),\(.rect.y) \(.rect.width)x\(.rect.height)"' | slurp -r -c ${config.look.colors.prime} -B 00000066 -b 00000000)
          if [ -n "$selected_window" ]; then
            app_id=$(swaymsg -t get_tree | jq -r '.. | select(.pid? and .visible?) | select("\(.rect.x),\(.rect.y) \(.rect.width)x\(.rect.height)" == "'"$selected_window"'") | .app_id')
            system=$(sed 's/xdg_shell/Wayland/g; s/xwayland/Xorg/g' < <(swaymsg -t get_tree | jq -r '.. | select(.pid? and .visible?) | select("\(.rect.x),\(.rect.y) \(.rect.width)x\(.rect.height)" == "'"$selected_window"'") | .shell'))
            notify-send "$(echo -e "Window's app_id: $app_id\nWindow System: $system")"
          fi
        }

        # Kill a selected window
        swaykill() {
          selected_window=$(swaymsg -t get_tree | jq -r '.. | select(.pid? and .visible?) | "\(.rect.x),\(.rect.y) \(.rect.width)x\(.rect.height)"' | slurp -r -c ${config.look.colors.prime} -B 00000066 -b 00000000)
          if [ -n "$selected_window" ]; then
            pid=$(swaymsg -t get_tree | jq -r '.. | select(.pid? and .visible?) | select("\(.rect.x),\(.rect.y) \(.rect.width)x\(.rect.height)" == "'"$selected_window"'") | .pid')
            kill -9 "$pid"
          fi
        }

        # Handle which tool we use
        if [ "$1" == "--prop" ]; then
          swayprop
        elif [ "$1" == "--kill" ]; then
          swaykill
        fi
      '';
    in {
      ## Launcher keys

      # LibreWolf profiles
      "${primeMod}+F1" = ''exec librewolf -P Main --name=MainBrowser | ${sendNotif} "Main Browser"'';
      "${primeMod}+F2" = ''exec librewolf -P Alt --name=AltBrowser | ${sendNotif} "Alternate Browser"'';
      "${primeMod}+F3" = ''exec librewolf -P Misc --name=MiscBrowser | ${sendNotif} "Miscellaneous Browser"'';

      # Virtual Machines
      "${primeMod}+F4" = ''exec virt-manager | ${sendNotif} "Virtual Machines"'';
      "${primeMod}+F5" = ''exec looking-glass-client input:rawMouse=yes | ${sendNotif} "Looking Glass"'';

      # BeMenu scripts
      "${primeMod}+${secMod}+s" = ''exec rofiscripts --scratchpads'';
      "${primeMod}+${secMod}+r" = ''exec rofiscripts --resolutions'';

      # Mod + Key
      "${primeMod}+s" = ''exec rofi -show run -p Command'';
      "${primeMod}+c" = ''exec clipman pick -t rofi'';
      "${primeMod}+x" = ''exec rofiscripts --power'';
      "${primeMod}+b" = ''exec pkill -USR1 waybar'';
      "${primeMod}+Return" = ''exec foot'';
      "${primeMod}+Escape" = ''exec ${swayTools} --kill'';
      "${primeMod}+Delete" = ''exec foot ranger /etc/nixos | ${sendNotif} "Nix Config"'';

      # Mod + shift + key
      "${primeMod}+Shift+s" = ''exec rofi -show drun -modi drun -drun-display-format {name} -show-icons -disable-history'';
      "${primeMod}+Shift+t" = ''exec pcmanfm-qt'';
      "${primeMod}+Shift+e" = ''exec BEMOJI_PICKER_CMD="rofi -dmenu -i -p Emoji" bemoji -n -P 0'';
      "${primeMod}+Shift+b" = ''exec rofi-bluetooth'';
      "${primeMod}+Shift+Return" = ''exec foot ranger'';

      # Mod + ctrl + key
      "${primeMod}+Ctrl+x" = ''exec ${swayTools} --prop'';
      "${primeMod}+Ctrl+c" = ''exec ${pkgs.hyprpicker}/bin/hyprpicker -an && ${sendNotif} "Color copied to clipboard"'';
      "${primeMod}+Ctrl+Prior" = ''exec ${pkgs.obs-cmd}/bin/obs-cmd scene switch "Main"'';
      "${primeMod}+Ctrl+Next" = ''exec ${pkgs.obs-cmd}/bin/obs-cmd scene switch "Guest"'';

      ## Media keys

      # Volume control
      "${secMod}+j" = ''exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-'';
      "${secMod}+k" = ''exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+'';

      # MPD Controls
      "${primeMod}+Backslash" = ''exec mpc toggle'';
      "${secMod}+Shift+h" = ''exec mpc prev'';
      "${secMod}+Shift+j" = ''exec mpc volume -3'';
      "${secMod}+Shift+k" = ''exec mpc volume +3'';
      "${secMod}+Shift+l" = ''exec mpc next'';

      ## Notification keys

      # Toggle mako
      "${primeMod}+n" = ''exec makotoggle'';
      "${primeMod}+Shift+n" = ''exec makoctl restore'';
      "${primeMod}+Ctrl+n" = ''exec makoctl dismiss -a'';

      ## Miscellaneous keys

      # Screenshots
      "${secMod}+f" = ''exec swayshot --swappy'';
      "${secMod}+Shift+f" = ''exec swayshot --screen'';

      # SSH
      "${primeMod}+${secMod}+Return" = ''exec foot ssh ${config.ips.server}'';

      # Display Brightness and Keyboard Brightness
      "${primeMod}+equal" = ''exec light -A 5'';
      "${primeMod}+minus" = ''exec light -U 5'';
      "${primeMod}+Shift+equal" = ''exec light -A 1'';
      "${primeMod}+Shift+minus" = ''exec light -U 1'';
      "XF86KbdBrightnessUp" = ''exec light -s sysfs/leds/smc::kbd_backlight -A 5'';
      "XF86KbdBrightnessDown" = ''exec light -s sysfs/leds/smc::kbd_backlight -U 5'';

      ## Window manager keys
      "${primeMod}+q" = ''kill'';
      "${primeMod}+Shift+r" = ''reload'';

      # Switch to workspaces
      "${primeMod}+grave" = ''workspace ${config.ws.w0}'';
      "${primeMod}+1" = ''workspace ${config.ws.w1}'';
      "${primeMod}+2" = ''workspace ${config.ws.w2}'';
      "${primeMod}+3" = ''workspace ${config.ws.w3}'';
      "${primeMod}+4" = ''workspace ${config.ws.w4}'';
      "${primeMod}+5" = ''workspace ${config.ws.w5}'';
      "${primeMod}+6" = ''workspace ${config.ws.w6}'';
      "${primeMod}+7" = ''workspace ${config.ws.w7}'';
      "${primeMod}+8" = ''workspace ${config.ws.w8}'';
      "${primeMod}+9" = ''workspace ${config.ws.w9}'';

      # Switch to alternate workspaces
      "${secMod}+F1" = ''workspace ${config.ws.w1a}'';
      "${secMod}+F2" = ''workspace ${config.ws.w2a}'';
      "${secMod}+F3" = ''workspace ${config.ws.w3a}'';
      "${secMod}+F4" = ''workspace ${config.ws.w4a}'';
      "${secMod}+F5" = ''workspace ${config.ws.w5a}'';
      "${secMod}+F6" = ''workspace ${config.ws.w6a}'';
      "${secMod}+F7" = ''workspace ${config.ws.w7a}'';
      "${secMod}+F8" = ''workspace ${config.ws.w8a}'';
      "${secMod}+F9" = ''workspace ${config.ws.w9a}'';

      # Move window to and focus new workspace
      "${primeMod}+Shift+grave" = ''move container to workspace ${config.ws.w0}; workspace ${config.ws.w0}'';
      "${primeMod}+Shift+1" = ''move container to workspace ${config.ws.w1}; workspace ${config.ws.w1}'';
      "${primeMod}+Shift+2" = ''move container to workspace ${config.ws.w2}; workspace ${config.ws.w2}'';
      "${primeMod}+Shift+3" = ''move container to workspace ${config.ws.w3}; workspace ${config.ws.w3}'';
      "${primeMod}+Shift+4" = ''move container to workspace ${config.ws.w4}; workspace ${config.ws.w4}'';
      "${primeMod}+Shift+5" = ''move container to workspace ${config.ws.w5}; workspace ${config.ws.w5}'';
      "${primeMod}+Shift+6" = ''move container to workspace ${config.ws.w6}; workspace ${config.ws.w6}'';
      "${primeMod}+Shift+7" = ''move container to workspace ${config.ws.w7}; workspace ${config.ws.w7}'';
      "${primeMod}+Shift+8" = ''move container to workspace ${config.ws.w8}; workspace ${config.ws.w8}'';
      "${primeMod}+Shift+9" = ''move container to workspace ${config.ws.w9}; workspace ${config.ws.w9}'';

      # Move window to and focus new alternate workspace
      "${secMod}+Shift+F1" = ''move container to workspace ${config.ws.w1a}; workspace ${config.ws.w1a}'';
      "${secMod}+Shift+F2" = ''move container to workspace ${config.ws.w2a}; workspace ${config.ws.w2a}'';
      "${secMod}+Shift+F3" = ''move container to workspace ${config.ws.w3a}; workspace ${config.ws.w3a}'';
      "${secMod}+Shift+F4" = ''move container to workspace ${config.ws.w4a}; workspace ${config.ws.w4a}'';
      "${secMod}+Shift+F5" = ''move container to workspace ${config.ws.w5a}; workspace ${config.ws.w5a}'';
      "${secMod}+Shift+F6" = ''move container to workspace ${config.ws.w6a}; workspace ${config.ws.w6a}'';
      "${secMod}+Shift+F7" = ''move container to workspace ${config.ws.w7a}; workspace ${config.ws.w7a}'';
      "${secMod}+Shift+F8" = ''move container to workspace ${config.ws.w8a}; workspace ${config.ws.w8a}'';
      "${secMod}+Shift+F9" = ''move container to workspace ${config.ws.w9a}; workspace ${config.ws.w9a}'';

      # Change focus across windows
      "${primeMod}+h" = ''focus left'';
      "${primeMod}+j" = ''focus down'';
      "${primeMod}+k" = ''focus up'';
      "${primeMod}+l" = ''focus right'';

      # Resize windows
      "${primeMod}+${secMod}+h" = ''resize shrink width ${resizeAmount} px or 5 ppt'';
      "${primeMod}+${secMod}+j" = ''resize shrink height ${resizeAmount} px or 5 ppt'';
      "${primeMod}+${secMod}+k" = ''resize grow height ${resizeAmount} px or 5 ppt'';
      "${primeMod}+${secMod}+l" = ''resize grow width ${resizeAmount} px or 5 ppt'';

      # Move focused window
      "${primeMod}+Shift+h" = ''move left ${resizeAmount} px'';
      "${primeMod}+Shift+j" = ''move down ${resizeAmount} px'';
      "${primeMod}+Shift+k" = ''move up ${resizeAmount} px'';
      "${primeMod}+Shift+l" = ''move right ${resizeAmount} px'';

      # Change focus between floating/tiled, toggle floating
      "${primeMod}+space" = ''focus mode_toggle'';
      "${primeMod}+Shift+space" = ''floating toggle'';

      # Allow a window to be visible on all workspaces, toggle border
      "${primeMod}+0" = ''exec ${pinWindow}'';

      # Toggle fullscreen
      "${primeMod}+f" = ''fullscreen toggle'';
      "${primeMod}+${secMod}+Ctrl+f" = ''fullscreen toggle global'';

      # Change container layout
      "${primeMod}+w" = ''layout toggle split'';
      "${primeMod}+e" = ''layout toggle tabbed stacking'';

      # Change split direction
      "${primeMod}+v" = ''split v'';

      # Focus parent / child
      "${primeMod}+a" = ''focus parent'';
      "${primeMod}+shift+a" = ''focus child'';

      # Scratchpads
      "Shift+Ctrl+Backslash" = ''[app_id="gotop"] scratchpad show, move position center, resize set 1216 888'';
      "${primeMod}+Shift+m" = ''[app_id="music"] scratchpad show, move position center, resize set 1006 657'';
      "${primeMod}+Shift+v" = ''[app_id="sound"] scratchpad show, move position center, resize set 1000 800'';
      "${primeMod}+Shift+Backslash" = ''[app_id="com.github.wwmm.easyeffects"] scratchpad show, move position center, resize set 1000 800'';
    };
  };
}