{
  config,
  pkgs,
  lib,
  ...
}:
let
  cfg = config.luj.programs.hyprland;
  terminal = "${pkgs.kitty}/bin/kitty";
  menu = "${pkgs.rofi-wayland}/bin/rofi -no-lazy-grab -show drun";
in
with lib;
{
  options.luj.programs.hyprland = {
    enable = mkEnableOption "Enable HyprLand";
  };

  config = mkIf cfg.enable {
    wayland.windowManager.hyprland = {
      enable = true;
      package = pkgs.unstable.hyprland;
      systemd = {
        enable = true;
        variables = [ "WLR_NO_HARDWARE_CURSORS=1" ];
      };
      settings = {
        # Variables
        "$mod" = "ALT_L";
        "$term" = terminal;
        "$launcher" = menu;

        general = {
          gaps_in = "6";
          gaps_out = "10";
        };
        input = {
          kb_layout = "fr";
          follow_mouse = 1;
          sensitivity = 0; # -1.0 - 1.0, 0 means no modification.
        };
        misc = {
          disable_hyprland_logo = true;
          disable_splash_rendering = true;
        };
        decoration = {
          rounding = 6;
        };
        animations.enabled = true;

        xwayland = {
          force_zero_scaling = true;
        };

        workspace = [
          "1,monitor:DP-3"
          "2,monitor:HDM1-A-1"
        ];

        exec = [ "hyprpaper" ];

        env = [
          "LIBVA_DRIVER_NAME, nvidia"
          "WLR_NO_HARDWARE_CURSORS, 1"
          "WLR_DRM_DEVICES,/home/julien/.config/hypr/card"
        ];

        monitor = [
          "DP-3, 2560x1440@60, 0x0, 1"
          "HDM1-A-1, 2560x1440@60, 2560x0, 1"
        ];

        bind = [
          "$mod, RETURN, exec, kitty"
          "$mod, SPACE, exec, $launcher"
          "$mod, w, exec, swaylock"

          # Window management
          "$mod, Q, killactive"
          "$mod, F, fullscreen"
          # Focus
          "$mod, left, movefocus, l"
          "$mod, right, movefocus, r"
          "$mod, up, movefocus, u"
          "$mod, down, movefocus, d"
          # Move
          "$mod SHIFT, left, movewindow, l"
          "$mod SHIFT, right, movewindow, r"
          "$mod SHIFT, up, movewindow, u"
          "$mod SHIFT, down, movewindow, d"

          # Switch workspaces
          "$mod, code:10, workspace, 1"
          "$mod, code:11, workspace, 2"
          "$mod, code:12, workspace, 3"
          "$mod, code:13, workspace, 4"
          "$mod, code:14, workspace, 5"
          "$mod, code:15, workspace, 6"
          "$mod, code:16, workspace, 7"
          "$mod, code:17, workspace, 8"
          "$mod, code:18, workspace, 9"
          "$mod, code:19, workspace, 10"

          "$mod SHIFT, code:10, movetoworkspace, 1"
          "$mod SHIFT, code:11, movetoworkspace, 2"
          "$mod SHIFT, code:12, movetoworkspace, 3"
          "$mod SHIFT, code:13, movetoworkspace, 4"
          "$mod SHIFT, code:14, movetoworkspace, 5"
          "$mod SHIFT, code:15, movetoworkspace, 6"
          "$mod SHIFT, code:16, movetoworkspace, 7"
          "$mod SHIFT, code:17, movetoworkspace, 8"
          "$mod SHIFT, code:18, movetoworkspace, 9"
          "$mod SHIFT, code:19, movetoworkspace, 10"

        ];

      };

    };

    xdg.configFile."hypr/hyprpaper.conf".text = ''
      preload = ${../../machines/fischer/wallpaper.jpg}
      wallpaper = ,${../../machines/fischer/wallpaper.jpg}
    '';

    services.swayidle = {
      enable = true;
      systemdTarget = "hyprland-session.target";
      events = [
        {
          event = "before-sleep";
          command = "${pkgs.swaylock-effects}/bin/swaylock --config /home/julien/.config/swaylock/config";
        }
      ];
    };

    programs.swaylock = {
      enable = true;
      package = pkgs.swaylock-effects;
      settings = {
        screenshots = true;
        clock = true;
        indicator = true;
        indicator-radius = 200;
        indicator-thickness = 20;
        grace = 0;
        grace-no-mouse = true;
        grace-no-touch = true;
        line-uses-ring = false;
        ignore-empty-password = true;
        show-failed-attempts = false;

        font = "Fira Code";
        timestr = "%H:%M";
        datestr = "";
        effect-blur = "8x5";
        effect-vignette = "0.5:0.5";
        color = "00000000";

      };

    };

    home.packages = with pkgs; [
      qt6.qtwayland
      libsForQt5.qt5.qtwayland
      hyprpaper
    ];

  };
}