{
  pkgs,
  config,
  lib,
  ...
}: let
  cfg = config.nixfiles.services.hypridle;
  inherit (lib.types) str int;
in {
  options.nixfiles.services.hypridle = {
    enable = lib.mkEnableOption "the hypridle configuration";
    timeouts = let
      mkTimeout = timeout: desc:
        lib.mkOption {
          description = "${desc}";
          type = int;
          default = timeout;
        };
    in {
      dpms = mkTimeout 300 "DPMS timeout";
      lock = mkTimeout 360 "Lock timeout";
      locked-dpms = mkTimeout 10 "DPMS timeout while locked";
    };
    commands = {
      dpms-off = lib.mkOption {
        description = "DPMS off command";
        default = "hyprctl dispatch dpms off";
        type = str;
      };
      dpms-on = lib.mkOption {
        description = "DPMS on command";
        default = "hyprctl dispatch dpms on";
        type = str;
      };

      # lock = lib.mkOption {
      #   description = "Lock command";
      #   default = "${pkgs.swaylock}/bin/swaylock";
      #   type = str;
      # };
      # unlock = lib.mkOption {
      #   description = "Unlock command";
      #   default = "${pkgs.procps}/bin/pkill -USR1 swaylock";
      #   type = str;
      # };
    };
  };
  config = lib.mkMerge [
    (lib.mkIf cfg.enable {
      services.hypridle = {
        enable = true;
        settings = let
          lock = pkgs.writeShellScript "lock-once" ''
            ${pkgs.procps}/bin/pgrep -x swaylock > /dev/null || "${config.programs.swaylock.package}/bin/swaylock"
          '';
        in {
          listener = let
            dpms-wrapped = pkgs.writeShellScript "dpms-wrapped" ''
              exec ${cfg.commands.dpms-off}
            '';
            lock-dpms = pkgs.writeShellScript "lock-dpms" ''
              ${pkgs.procps}/bin/pgrep -x swaylock > /dev/null && "${dpms-wrapped}"
            '';
          in [
            {
              timeout = cfg.timeouts.dpms;
              on-timeout = cfg.commands.dpms-off;
              on-resume = cfg.commands.dpms-on;
            }
            # {
            #   timeout = cfg.timeouts.locked-dpms;
            #   on-timeout = "${lock-dpms}";
            #   on-resume = cfg.commands.dpms-on;
            # }
            {
              timeout = cfg.timeouts.lock;
              on-timeout = "${lock}";
            }
            {
              timeout = cfg.timeouts.lock + cfg.timeouts.locked-dpms;
              on-timeout = cfg.commands.dpms-off;
              on-resume = cfg.commands.dpms-on;
            }
          ];

          general = {
            lock_cmd = "${lock}";
            unlock_cmd = "${pkgs.procps}/bin/pkill -x -USR1 swaylock";
            before_sleep_cmd = "${config.programs.swaylock.package}";
            ignore_dbus_inhibit = false;
            # after_sleep_cmd = "echo 'Awake...'";
          };
        };
      };
    })
    # why isn't this handled automatically??
    (lib.mkIf config.services.hypridle.enable {
      home.packages = with pkgs; [
        hypridle
      ];
    })
  ];
}