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

with lib;
let
  cfg = config.modules.desktop.hypridle;
in {
  options.modules.desktop.hypridle = {
    enable = mkEnableOption "Enable hypridle, hyprland's idle daemon";
    package = mkOption {
      type = types.package;
      default = inputs.hypridle.packages.${system}.hypridle;
      example = "pkgs.hypridle";
    };
  };

  config = mkIf cfg.enable {
    hm.services.hypridle = let
      hyprctl = "${config.modules.desktop.hyprland.package}/bin/hyprctl";
    in {
      enable = true;
      package = cfg.package;

      settings = {
        general = {
          lock_cmd = "${pkgs.procps}/bin/pidof hyprlock || ${lib.getExe config.modules.desktop.hyprlock.package}";
          unlock_cmd = "${pkgs.procps}/bin/pkill -USR1 hyprlock";

          before_sleep_cmd = "${pkgs.systemd}/bin/loginctl lock-session"; # lock the screen before sleeping
          after_sleep_cmd = "${hyprctl} dispatch dpms on"; # turn on the screen to avoid moving mouse/pressing key
        };

        listener = [
          {
            timeout = 60 * 1;
            on-timeout = "${lib.getExe pkgs.brightnessctl} -c backlight -s set 20"; # dim screen, save brightness state
            on-resume = "${lib.getExe pkgs.brightnessctl} -c backlight -r"; # restore previous screen brightness state
          }
          {
            timeout = 90; # 1.5 min
            on-timeout = "${hyprctl} dispatch dpms off"; # turn off screen
            on-resume = "${hyprctl} dispatch dpms on"; # turn it back on
          }
          {
            timeout = 60 * 2; # 2 min
            on-timeout = "${pkgs.systemd}/bin/loginctl lock-session"; # lock computer
          }
          {
            timeout = 60 * 15; # 15 min
            on-timeout = "${pkgs.systemd}/bin/systemctl suspend"; # sleep/suspend
          }
        ];
      };
    };
  };
}
