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

with lib;

let
  cfg = config.settings.desktop-environments.hyprland;
in {
  options = {
    settings.desktop-environments.hyprland.enable = lib.mkOption {
      type = lib.types.bool;
      description = ''
        Enable hyprland window manager configuration
      '';
    };
  };

  imports = [
    ./waybar.nix
    ./fixes.nix
    ./dunst.nix
    ./rofi.nix
  ];

  config = mkIf cfg.enable {

    home.packages = with pkgs; [
      alacritty
      wev
      brightnessctl
      playerctl
      wl-clipboard
      grimblast
      nwg-bar
      powertop
      lxqt.lxqt-policykit

      networkmanagerapplet
    ];

    wayland.windowManager.hyprland = {
      enable = true;
      settings = {
        monitor = lib.mkIf (config.host == "xv-laptop") [
          "eDP-1,preferred,3840x0,1.333"
          "DP-10,preferred,0x0,1"
          "DP-9,preferred,1920x0,1"
        ];

        exec-once = [
          "waybar"
          "lxqt-policykit-agent"
          "nm-applet"
          "blueman-applet"
        ];

        env = lib.mkIf (config.host == "xv-desktop") [
          "LIBVA_DRIVER_NAME,nvidia"
          "XDG_SESSION_TYPE,wayland"
          "GBM_BACKEND,nvidia-drm"
          "__GLX_VENDOR_LIBRARY_NAME,nvidia"
        ];

        "$mod" = "SUPER";

        input = {
          follow_mouse = 2;
          touchpad = {
            natural_scroll = true;
            scroll_factor = 0.5;
            clickfinger_behavior = true;
          };
        };

        general = {
          gaps_in = "5";
          gaps_out = "10";
          border_size = "2";

          "col.active_border" = "rgba(00bfffee) rgba(36b7e2ee) 45deg";
          "col.inactive_border" = "rgba(0a3543aa)";

          layout = "dwindle";
        };

        decoration = {
          rounding = "5";
          blur.enabled = "false";
        };

        gestures = {
          workspace_swipe = "on";
          workspace_swipe_distance = "200";
        };

        misc = {
          vfr = "true";
          vrr = 2;
          force_default_wallpaper = "0";
        };

        xwayland = {
          force_zero_scaling = true;
        };

        workspace = lib.mkMerge [[
        
        ]
        (lib.mkIf (config.host == "xv-desktop") [
          "1, monitor:DP-1"
          "2, monitor:DP-1"
          "3, monitor:DP-1"
          "4, monitor:DP-1"
          "5, monitor:DP-1"
          "6, monitor:HDMI-A-1"
          "7, monitor:HDMI-A-1"
          "8, monitor:HDMI-A-1"
          "9, monitor:HDMI-A-1"
          "10, monitor:HDMI-A-1"
        ])
        (lib.mkIf (config.host == "xv-laptop") [
          "1, monitor:DP-10"
          "2, monitor:DP-10"
          "3, monitor:DP-10"
          "4, monitor:DP-10"
          "5, monitor:DP-9"
          "6, monitor:DP-9"
          "7, monitor:DP-9"
          "8, monitor:eDP-1"
          "9, monitor:eDP-1"
          "10, monitor:eDP-1"
        ])];

        bind = [
          "$mod, Q, exec, alacritty"
          "$mod, SPACE, exec, rofi -show drun"
          ",Print, exec, grimblast copy area"
          "$mod,ESCAPE, exec, nwg-bar"
          "$mod, P, exit"

          "$mod, C, killactive"
          "$mod SHIFT, C, exec, hyprctl kill"
          "$mod, V, togglefloating"
          "$mod, F, fullscreen, 0"
          "$mod, M, fullscreen, 1"
          "$mod SHIFT, L, exec, hyprlock" 
          "$mod, S, exec, systemctl suspend" 

          "$mod, h, movefocus, l"
          "$mod, l, movefocus, r"
          "$mod, k, movefocus, u"
          "$mod, j, movefocus, d"

          "$mod SHIFT, h, movewindow, l"
          "$mod SHIFT, l, movewindow, r"
          "$mod SHIFT, k, movewindow, u"
          "$mod SHIFT, j, movewindow, d"

          "$mod ALT, h, resizeactive, -20 0"
          "$mod ALT, l, resizeactive, 20 0"
          "$mod ALT, k, resizeactive, 0 -20"
          "$mod ALT, j, resizeactive, 0 20"

          "$mod, 1, workspace, 1"
          "$mod, 2, workspace, 2"
          "$mod, 3, workspace, 3"
          "$mod, 4, workspace, 4"
          "$mod, 5, workspace, 5"
          "$mod, 6, workspace, 6"
          "$mod, 7, workspace, 7"
          "$mod, 8, workspace, 8"
          "$mod, 9, workspace, 9"
          "$mod, 0, workspace, 10"

          "$mod SHIFT, 1, movetoworkspace, 1"
          "$mod SHIFT, 2, movetoworkspace, 2"
          "$mod SHIFT, 3, movetoworkspace, 3"
          "$mod SHIFT, 4, movetoworkspace, 4"
          "$mod SHIFT, 5, movetoworkspace, 5"
          "$mod SHIFT, 6, movetoworkspace, 6"
          "$mod SHIFT, 7, movetoworkspace, 7"
          "$mod SHIFT, 8, movetoworkspace, 8"
          "$mod SHIFT, 9, movetoworkspace, 9"
          "$mod SHIFT, 0, movetoworkspace, 10"
        ];

        bindle = [
          # Volume control
          ",XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+"
          ",XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"

          # Brightness control
          ",XF86MonBrightnessUp, exec, brightnessctl set 5%+"
          ",XF86MonBrightnessDown, exec, brightnessctl set 5%-"
        ];

        bindl= [
          # Toggle audio mute
          ",XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"

          # Media control
          ",XF86AudioPlay, exec, playerctl play-pause"
          ",XF86AudioNext, exec, playerctl next"
          ",XF86AudioPrev, exec, playerctl previous"
        ];

        bindm = [
          "$mod, mouse:272, movewindow"
          "$mod, mouse:273, resizewindow"
        ];
      };
    };
  };
}

