{
  lib,
  pkgs,
  config,
  ...
}: let
  modifier = config.windowManager.modifierKey;
  menu = config.programs.menu.dmenuCommand;
  lock_cmd = "${config.programs.hyprlock.package}/bin/hyprlock";
  color = {
    inherit (config.lib.stylix.colors) yellow red;
    bg = config.lib.stylix.colors.base00;
    fg = config.lib.stylix.colors.base07;
    text = config.lib.stylix.colors.base05;
  };
  rgb = color: "rgb(${color})";
in {
  imports = [
    (import ../utils/waybar.nix)
    (import ../utils/display.nix)
    ../../workstation.nix
  ];
  xdg.portal = {
    enable = true;
    configPackages = [pkgs.hyprland];
    extraPortals = [pkgs.xdg-desktop-portal-gtk pkgs.xdg-desktop-portal-wlr];
  };

  services.hypridle = {
    enable = true;
    settings = {
      general = {
        before_sleep_cmd = "rbw lock; hyprlock";
        after_sleep_cmd = "hyprctl dispatch dpms on";
        ignore_dbus_inhibit = false;
        lock_cmd = "pidof ${lock_cmd} || ${lock_cmd}";
      };

      listener = [
        {
          timeout = 300;
          on-timeout = "loginctl lock-session";
        }
        {
          timeout = 1200;
          on-timeout = "hyprctl dispatch dpms off";
          on-resume = "hyprctl dispatch dpms on";
        }
      ];
    };
  };

  programs.hyprlock = {
    enable = true;
    settings = lib.mkForce {
      # https://wiki.hyprland.org/Hypr-Ecosystem/hyprlock/
      general = {
        hide_cursor = true;
        grace = 10;
        ignore_empty_input = true;
      };

      background = [
        {
          path = "screenshot";
          blur_passes = 3;
          blur_size = 8;
        }
      ];

      input-field = [
        {
          dots_center = true;
          fade_on_empty = true;
          outline_thickness = 5;
          shadow_passes = 2;
          inner_color = rgb color.bg;
          outer_color = rgb color.fg;
          font_color = rgb color.text;
          fail_color = rgb color.red;
          check_color = rgb color.yellow;
        }
      ];
    };
  };

  wayland.windowManager.hyprland = {
    enable = true;
    systemd = {
      enable = true;
      # variables = ["--all"];
    };
    xwayland.enable = true;
    settings = {
      input = {
        touchpad = {
          natural_scroll = true;
          scroll_factor = 0.5;
        };
        kb_options = lib.mkDefault "caps:escape";
        kb_layout = lib.mkDefault "gb";
        numlock_by_default = true;
      };
      gestures = {
        workspace_swipe = true;
      };
      decoration = {
        rounding = 0;
      };
      bezier = [
        "overshot, 0.05, 0.9, 0.1, 1.1"
        "linear, 0.0, 0.0, 1.0, 1.0"
      ];
      animations = {
        enabled = true;
        animation = [
          "windows,    1, 3, default, popin"
          "border,     1, 1, default"
          "fade,       1, 1, default"
          "workspaces, 1, 1, default"
          "borderangle,1, 50, linear, loop"
        ];
      };
      bind = [
        # movement
        "${modifier}, h, movefocus, l"
        "${modifier}, l, movefocus, r"

        "${modifier}_SHIFT, space, cyclenext, floating"

        # window management
        "${modifier}, F,       fullscreen,"
        "${modifier}, V,       togglefloating,"
        "${modifier}_SHIFT, X, killactive"

        # master layout
        "${modifier}, j, layoutmsg, rollnext"
        "${modifier}, k, layoutmsg, rollprev"
        "${modifier}, space,   layoutmsg, swapwithmaster master"
        "${modifier}, W,       layoutmsg, orientationtop"
        "${modifier}_SHIFT, W, layoutmsg, orientationleft"

        # window grouping
        "${modifier}_SHIFT, V, togglegroup,"
        "${modifier}_SHIFT, j, changegroupactive, f"
        "${modifier}_SHIFT, k, changegroupactive, b"
        "${modifier}_SHIFT, h, moveintogroup, l"
        "${modifier}_SHIFT, l, moveintogroup, r"

        # scratch buffer
        "${modifier}, Y,       togglespecialworkspace"
        "${modifier}_SHIFT, Y, movetoworkspace, special"

        # applications
        "${modifier}, slash, focuswindow, brave-browser"
        "${modifier}, n,     focuswindow, Logseq"

        # workspaces
        "${modifier}, 1,        workspace,1"
        "${modifier}, 2,        workspace,2"
        "${modifier}, 3,        workspace,3"
        "${modifier}, 4,        workspace,4"
        "${modifier}, 5,        workspace,5"
        "${modifier}, 6,        workspace,6"
        "${modifier}, 7,        workspace,7"
        "${modifier}, 8,        workspace,8"
        "${modifier}, 9,        workspace,9"
        "${modifier}, 0,        workspace,10"
        "${modifier}, left,     workspace,r-1"
        "${modifier}, right,    workspace,r+1"
        "${modifier}_SHIFT, 1,  movetoworkspace,1"
        "${modifier}_SHIFT, 2,  movetoworkspace,2"
        "${modifier}_SHIFT, 3,  movetoworkspace,3"
        "${modifier}_SHIFT, 4,  movetoworkspace,4"
        "${modifier}_SHIFT, 5,  movetoworkspace,5"
        "${modifier}_SHIFT, 6,  movetoworkspace,6"
        "${modifier}_SHIFT, 7,  movetoworkspace,7"
        "${modifier}_SHIFT, 8,  movetoworkspace,8"
        "${modifier}_SHIFT, 9,  movetoworkspace,9"
        "${modifier}_SHIFT, 0,  movetoworkspace,10"
      ];
      bindm = [
        "${modifier}, mouse:272, movewindow"
        "${modifier}, mouse:273, resizewindow"
      ];
      env = [
        "GDK_BACKEND,wayland,x11"
        "QT_QPA_PLATFORM,wayland;xcb"
        "SDL_VIDEODRIVER,wayland"
        "CLUTTER_BACKEND,wayland"
        "XDG_CURRENT_DESKTOP,Hyprland"
        "XDG_SESSION_TYPE,wayland"
        "XDG_SESSION_DESKTOP,Hyprland"
        "QT_AUTO_SCREEN_SCALE_FACTOR,1"
        "QT_WAYLAND_DISABLE_WINDOWDECORATION,1"
        "NIXOS_OZONE_WL,1"
      ];
      windowrule = [
        "float, title:wlogout"
        "idleinhibit always, vrmonitor"
        "idleinhibit focus, steam_app"
      ];
      workspace = [
        "11, default:true"
      ];
      general = {
        gaps_out = 2;
        gaps_in = 2;
        resize_on_border = true;
        layout = "master";
        "col.active_border" = lib.mkForce "rgb(FFFF00) rgb(00FFFF) rgb(FF00FF)";
        border_size = lib.mkDefault 2;
      };
      master = {
        mfact = 0.7;
        new_on_top = true;
      };
      misc = {
        vrr = 2;
        focus_on_activate = true;
      };
    };
    # https://wiki.hyprland.org/Configuring/Variables/
    extraConfig = ''
      bind = ${modifier}, R, submap, resize

      submap = resize
        binde = ,right,resizeactive,10 0
        binde = ,left,resizeactive,-10 0
        binde = ,up,resizeactive,0 -10
        binde = ,down,resizeactive,0 10
        binde = ,k,resizeactive,0 -10
        binde = ,j,resizeactive,0 10
        binde = ,l,splitratio,0.05
        binde = ,h,splitratio,-0.05
        binde = SHIFT,l,splitratio,0.3
        binde = SHIFT,h,splitratio,-0.3

        bind = ,   escape, submap,reset
        bind = ,    enter, submap,reset
        bind = ${modifier},   R, submap,reset
        bind = CONTROL, C, submap,reset
      submap = reset

      bind = ${modifier}_CONTROL, V, submap, passthrough

      submap = passthrough
        bind = ${modifier}_CONTROL, V, submap, reset
        bind = SUPER, escape, submap, reset
      submap = reset

      device {
        name = zsa-technology-labs-moonlander-mark-i
        kb_variant =
        kb_options = esperanto:qwerty,lv3:ralt_switch
      }
    '';
  };

  programs.scripts = [
    {
      name = "focus-application";
      install = true;
      text = ''
        windows=$(hyprctl clients -j | jq -r '.[] | .title')
        window=$(echo "$windows" | ${menu})
        hyprctl dispatch focuswindow title:"$window"
      '';
      hotkeys = [
        {
          key = "tab";
        }
      ];
    }
  ];

  services.mako = {
    enable = true;
  };

  programs.waybar = {
    settings.mainBar.modules-left = ["hyprland/workspaces" "hyprland/window"];
    systemd.target = "hyprland-session.target";
  };

  systemd.user.services.hypridle.Install.WantedBy = lib.mkForce ["hyprland-session.target"];
}
