{
  pkgs,
  lib,
  config,
  ...
}:
{
  options.hyprland.enable = lib.mkEnableOption "Hyprland";
  config = {
    home.packages = with pkgs; [
      dunst
      rofi-wayland
      slurp
      swww
      waybar
      wl-clipboard
      catppuccin-cursors.macchiatoLavender
      bibata-cursors
      # For potentially fixing some issues
      libsForQt5.qt5.qtwayland
      libsForQt5.qt5ct
    ];

    services.hyprpaper = {
      enable = true;
      settings = {
        splash = false;
      };
    };
    services.hypridle = {
      enable = true;
      settings = {
        general = {
          lock_cmd = "hyprlock";
          before_sleep_cmd = "lockhelper";
          ignore_dbus_inhibit = false;
        };
        listener = {
          timeout = 240;
          on-timeout = "lockhelper";
        };
      };
    };

    programs.hyprlock = {
      enable = true;
      settings = {
        background = [
          {
            monitor = "DP-5";
            path = "/tmp/lockscreen/DP-5.png";
            blur_passes = 3;
            contrast = 0.8916;
            brightness = 0.8172;
            vibrancy = 0.1696;
            vibrancy_darkness = 0.0;
          }
          {
            monitor = "DP-6";
            path = "/tmp/lockscreen/DP-6.png";
            blur_passes = 3;
            contrast = 0.8916;
            brightness = 0.8172;
            vibrancy = 0.1696;
            vibrancy_darkness = 0.0;
          }
          {
            monitor = "DP-7";
            path = "/tmp/lockscreen/DP-7.png";
            blur_passes = 3;
            contrast = 0.8916;
            brightness = 0.8172;
            vibrancy = 0.1696;
            vibrancy_darkness = 0.0;
          }
          {
            monitor = "DP-8";
            path = "/tmp/lockscreen/DP-8.png";
            blur_passes = 3;
            contrast = 0.8916;
            brightness = 0.8172;
            vibrancy = 0.1696;
            vibrancy_darkness = 0.0;
          }
        ];

        general = {
          no_fade_in = false;
          grace = 0;
          disable_loading_bar = true;
        };

        input-field = [
          {
            size = "250, 60";
            outline_thickness = 2;
            dots_size = 0.2;
            dots_spacing = 0.2;
            dots_center = true;
            outer_color = "rgba(0, 0, 0, 0)";
            inner_color = "rgba(0, 0, 0, 0.5)";
            font_color = "rgb(200, 200, 200)";
            fade_on_empty = false;
            font_family = "JetBrains Mono Nerd Font Mono";
            placeholder_text = "<i><span foreground=\"##cdd6f4\">Input Password...</span></i>";
            hide_input = false;
            position = "0, -120";
            halign = "center";
            valign = "center";
          }
        ];

        label = [
          {
            text = "cmd[update:2000] echo \"$(date +\"%b %d %H:%M\")\"";
            color = "rgba(255, 255, 255, 0.6)";
            font_size = 120;
            font_family = "JetBrains Mono Nerd Font Mono ExtraBold";
            position = "0, -300";
            halign = "center";
            valign = "top";
          }
        ];
      };
    };

    # streamcontroller service
    systemd.user.services = {
      streamcontroller = {
        Unit = {
          Description = "Streamcontroller service";
          PartOf = [ "graphical-session.target" ];
          After = [ "graphical-session.target" ];
          Requisite = [ "graphical-session.target" ];
        };

        Service = {
          ExecStart = "${pkgs.streamcontroller}/bin/streamcontroller -b";
          Restart = "on-failure";
        };

        Install = {
          WantedBy = [ "graphical-session.target" ];
        };
      };
    };

    wayland.windowManager.hyprland = {
      enable = true;
      package = pkgs.hyprland;
      settings = {
        "$mainMod" = "SUPER";
        "$shiftMainMod" = "SUPER_SHIFT";
        "$term" = "kitty";

        # monitors
        "$mon_top" = "desc:BNQ G2420HDBL T2B04424SL000";
        "$mon_left" = "desc:Samsung Electric Company LS27A600U HNMT502389";
        "$mon_center" = "desc:Acer Technologies XB271HU #ASPVEKfgZ8Dd";
        "$mon_right" = "desc:Samsung Electric Company LS27A600U HNMT502390";

        monitor = [
          # "$mon_top,1920x1080@60,2560x0,1" # top T2B04424SL000
          "DP-6,1920x1080@60,2560x0,1" # top T2B04424SL000 60
          # "$mon_left,2560x1440@75,0x1080,1" # left
          "DP-8,2560x1440@75,0x1080,1" # left 75hz
          # "$mon_center,2560x1440@120,2560x1080,1" # main #ASPVEKfgZ8Dd
          "DP-5,2560x1440@144,2560x1080,1" # main #ASPVEKfgZ8Dd 120hz
          # "$mon_right,2560x1440@75,5120x1080,1" # right
          "DP-7,2560x1440@75,5120x1080,1" # right 75hz
        ];
        input = {
          kb_layout = "no";
          follow_mouse = 1;
        };

        cursor = {
          no_hardware_cursors = true;
        };

        env = [
          "LIBVA_DRIVER_NAME,nvidia"
          "XDG_SESSION_TYPE,wayland"
          "GBM_BACKEND,nvidia-drm"
          # "__GLX_VENDOR_LIBRARY_NAME,nvidia"
          "WLR_NO_HARDWARE_CURSORS,1"
        ];

        decoration = {
          rounding = 10;
          # shadow = {
          #   enable = true;
          #   range = 4;
          #   render_power = 3;
          # };
          blur = {
            enabled = true;
            size = 3;
            passes = 1;
            xray = true;
          };
        };

        general = {
          gaps_in = 4;
          gaps_out = 10;
          border_size = 2;
          layout = "dwindle";
        };

        animations = {
          enabled = true;
          bezier = [
            "myBezier, 0.05, 0.9, 0.1, 1.05"
            "easeInB, 0.6, -0.28, 0.735, 0.045"
          ];
          animation = [
            "windows, 1, 7, myBezier"
            "windowsOut, 1, 7, default, popin 80%"
            "border, 1, 10, default"
            "borderangle, 1, 8, default"
            "fade, 1, 7, default"
            "workspaces, 1, 6, easeInB, slidefadevert"
            "specialWorkspace, 1, 4, default, fade"
          ];
        };
        dwindle = {
          pseudotile = true;
          preserve_split = true;
          special_scale_factor = 0.85;
        };
        master = {
          new_status = "master";
        };
        misc = {
          force_default_wallpaper = 0;
          disable_hyprland_logo = true;
        };

        windowrulev2 = [
          "opacity 0.95 override 0.7 override,class:^(Alacritty)$"
          "opacity 0.95 override 0.7 override,class:^(kitty)$"
        ];

        workspace = [
          "name:T1, monitor:$mon_top, persistent:true, default:true"
          "name:T2, monitor:$mon_top, persistent:true, default:false"
          "name:L1, monitor:$mon_left, persistent:true, default:true"
          "name:L2, monitor:$mon_left, persistent:true, default:false"
          "name:R1, monitor:$mon_right, persistent:true, default:true"
          "name:R2, monitor:$mon_right, persistent:true, default:false"
          "name:c1, monitor:$mon_center, persistent:true, default:true"
          "name:c2, monitor:$mon_center, persistent:true, default:false"
          "name:c3, monitor:$mon_center, persistent:true, default:false"
          "name:c4, monitor:$mon_center, persistent:true, default:false"
          "special:special, on-created-empty:kitty, rounding:true, decorate:false, border:false"
        ];

        bindm = [
          "$mainMod,mouse:272,movewindow"
          "$shiftMainMod,mouse:272,resizewindow"
        ];

        bindr = [
          # mumble ptt release
          # ",code:202,exec,mumble rpc stoptalking"
          # ",code:202,exec,pamixer --source 63 -m"
          # ",code:202,exec,sleep 0.5 && pamixer --default-source -m"
        ];

        bind = [
          # term
          "$mainMod,Return,exec,$term"

          # hyprlock
          "$shiftMainMod,l,exec,lockhelper"

          # rofi
          "$mainMod,D,exec,rofi-launcher"
          "$mainMod,P,exec,rofi-rbw"

          # hyprland
          "$mainMod,Q,killactive,"
          "CTRLALT,Delete,exit,"
          "$mainMod,Space,togglefloating,"
          "$mainMod,F,fullscreen,"

          # focus
          "$mainMod,l,movefocus,l"
          "$mainMod,h,movefocus,r"
          "$mainMod,k,movefocus,u"
          "$mainMod,j,movefocus,d"

          # move
          "$mainMod,h,movewindow,l"
          "$mainMod,l,movewindow,r"
          "$mainMod,k,movewindow,u"
          "$mainMod,j,movewindow,d"

          # Force opacity
          "$shiftMainMod,o,exec, hl-no-opacity"

          # grimblast
          "$mainMod,Print,exec,grimblast save active ~/tmp/$(date -Iseconds).png"
          "$shiftMainMod,Print,exec,grimblast copy area"
          ",Print,exec,grimblast copy active"

          # mumble ptt click
          # ",code:202,exec,mumble rpc starttalking"
          #",code:202,pass,^(info\.mumble\.Mumble)$"
          # ",code:202,exec,pamixer --default-source -u"
          ",code:202,pass,^discord$"

          # Paste to wtype
          "$mainMod,v,exec,sleep 0.5s && wl-paste | wtype -"

          # worspace switching
          "$mainMod,1,workspace,name:c1"
          "$mainMod,2,workspace,name:c2"
          "$mainMod,3,workspace,name:c3"
          "$mainMod,4,workspace,name:c4"
          "$mainMod,5,workspace,5"
          "$mainMod,6,workspace,6"

          # Move window to workspace
          "$shiftMainMod,1,movetoworkspace,name:c1"
          "$shiftMainMod,2,movetoworkspace,name:c2"
          "$shiftMainMod,3,movetoworkspace,name:c3"
          "$shiftMainMod,4,movetoworkspace,name:c4"
          "$shiftMainMod,5,movetoworkspace,5"
          "$shiftMainMod,6,movetoworkspace,6"

          # Special workspace
          "$mainMod,c,togglespecialworkspace"
          "$shiftMainMod,c,movetoworkspace, special"
        ];

        exec-once = [
          "waybar"
          # "hyprpaper & sleep 10 && randomwp"
          # "easyeffects --gapplication-service"
          # "hypridle"
          # "streamcontroller -b"
          # "dunst"
        ];
      };
    };
  };
}