{
  pkgs,
  lib,
  ...
}: let
  inherit (lib) range mapAttrsToList;
  inherit (builtins) toString;
  workspaceRange = range 1 6;
  makeWorkspaceBinding = modifiers: action:
    map (i: {
      inherit modifiers;
      key = toString i;
      action = {
        type = action;
        data = i;
      };
    })
    workspaceRange;
  focusWsBindings = makeWorkspaceBinding ["Super"] "Workspace";
  moveWsBindings = makeWorkspaceBinding ["Super" "Shift"] "SendToWorkspace";

  hjkl = {
    "h" = "Left";
    "j" = "Down";
    "k" = "Up";
    "l" = "Right";
    # "i" = "In";
    # "u" = "Out";
  };
  makeDirBinding = modifiers: action:
    mapAttrsToList (
      key: dir: {
        inherit key modifiers;
        action = {
          type = action;
          data = dir;
        };
      }
    )
    hjkl;
  focusBindings = makeDirBinding ["Super"] "Focus";
  moveBindings = makeDirBinding ["Super" "Shift"] "Move";
  winManagementBindings =
    focusWsBindings
    ++ moveWsBindings
    ++ focusBindings
    ++ moveBindings;
  binding = key: modifiers: action: {
    inherit key modifiers action;
  };
  spawnBinding = key: modifiers: app: {
    inherit key modifiers;
    action = {
      type = "Spawn";
      data = app;
    };
  };
  systemBinding = key: modifiers: action: {
    inherit key modifiers;
    action = {
      type = "System";
      data = action;
    };
  };
in {
  imports = [
    ../util/cosmic.nix
  ];
  config.cosmic = {
    enable = true;
    defaultKeybindings = false;
    keybindings =
      winManagementBindings
      ++ [
        # System bindings appear broken?
        (binding "q" ["Super" "Shift"] "Close")
        (binding "w" ["Super"] "ToggleStacking")
        (binding "s" ["Super"] "ToggleOrientation")
        (binding "space" ["Super"] "ToggleWindowFloating")
        (binding "space" ["Super" "Shift"] "Maximize")
        (binding "minus" ["Super"] "Minimize")
        (binding "r" ["Super"] {
          type = "Resizing";
          data = "Outwards";
        })
        (binding "r" ["Super" "Shift"] {
          type = "Resizing";
          data = "Inwards";
        })
        (binding "tab" ["Super"] "NextOutput")
        (binding "tab" ["Super" "Shift"] "MoveToNextOutput")
        (binding "grave" ["Super"] "PreviousOutput")
        (binding "grave" ["Super" "Shift"] "MoveToPreviousOutput")
        (spawnBinding "equal" ["Super"] "keepassxc")
        (systemBinding "f" ["Super"] "WebBrowser")
        # my mime handling is fucked
        # (systemBinding "e" ["Super"] "HomeFolder")
        # (systemBinding "return" ["Super"] "Terminal")
        (spawnBinding "return" ["Super"] "kitty")
        # (systemBinding "s" ["Super" "Shift"] "Screenshot")
        (systemBinding null ["Super"] "Launcher")
        (systemBinding "d" ["Super"] "AppLibrary")
        (systemBinding "XF86AudioRaiseVolume" [] "VolumeRaise")
        (systemBinding "XF86AudioLowerVolume" [] "VolumeLower")
        (systemBinding "XF86AudioMute" [] "Mute")
        (spawnBinding "XF86AudioNext" [] "playerctl next")
        (spawnBinding "XF86AudioPrev" [] "playerctl previous")
        (spawnBinding "XF86AudioPlay" [] "playerctl play-pause")
        (spawnBinding "XF86AudioStop" [] "playerctl stop")
        (systemBinding "XF86MonBrightnessUp" [] "BrightnessUp")
        (systemBinding "XF86MonBrightnessDown" [] "BrightnessDown")
        (spawnBinding "e" ["Super" "Shift"] "wlogout")

        # old, pre-System bindings
        # (binding "q" ["Super" "Shift"] "Close")
        # (binding "w" ["Super"] "ToggleStacking")
        # (binding "s" ["Super"] "ToggleOrientation")
        # (binding "space" ["Super"] "ToggleWindowFloating")
        # (binding "space" ["Super" "Shift"] "Maximize")
        # (binding "minus" ["Super"] "Minimize")
        # (binding "r" ["Super"] {
        #   type = "Resizing";
        #   data = "Outwards";
        # })
        # (binding "r" ["Super" "Shift"] {
        #   type = "Resizing";
        #   data = "Inwards";
        # })
        # (binding "tab" ["Super"] "NextOutput")
        # (binding "tab" ["Super" "Shift"] "MoveToNextOutput")
        # (binding "grave" ["Super"] "PreviousOutput")
        # (binding "grave" ["Super" "Shift"] "MoveToPreviousOutput")
        # (spawnBinding "f" ["Super"] "firefox")
        (spawnBinding "e" ["Super"] "nautilus")
        # (spawnBinding "equal" ["Super"] "keepassxc")
        # (spawnBinding "return" ["Super"] "kitty")
        (spawnBinding "s" ["Super" "Shift"] "cosmic-screenshot")
        # (spawnBinding null ["Super"] "cosmic-launcher")
        # (spawnBinding "d" ["Super"] "cosmic-app-library")
        # (spawnBinding "XF86AudioRaiseVolume" [] "amixer sset Master 5%+")
        # (spawnBinding "XF86AudioLowerVolume" [] "amixer sset Master 5%-")
        # (spawnBinding "XF86AudioMute" [] "amixer sset Master toggle")
        # (spawnBinding "XF86AudioNext" [] "playerctl next")
        # (spawnBinding "XF86AudioPrev" [] "playerctl previous")
        # (spawnBinding "XF86AudioPlay" [] "playerctl play-pause")
        # (spawnBinding "XF86AudioStop" [] "playerctl stop")
        # (
        #   spawnBinding "XF86MonBrightnessUp" []
        #   "busctl --user call com.system76.CosmicSettingsDaemon /com/system76/CosmicSettingsDaemon com.system76.CosmicSettingsDaemon IncreaseDisplayBrightness"
        # )
        # (
        #   spawnBinding "XF86MonBrightnessDown" []
        #   "busctl --user call com.system76.CosmicSettingsDaemon /com/system76/CosmicSettingsDaemon com.system76.CosmicSettingsDaemon DecreaseDisplayBrightness"
        # )
        # (spawnBinding "e" ["Super" "Shift"] "wlogout")
      ];
  };
}
