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

with lib;

{

  ###### interface

  options = with types; {

    services.freefall = {

      enable = mkOption {
        default = false;
        description = ''
          Whether to protect HP/Dell laptop hard drives (not SSDs) in free fall.
        '';
        type = bool;
      };

      devices = mkOption {
        default = [ "/dev/sda" ];
        description = ''
          Device paths to all internal spinning hard drives.
        '';
        type = listOf string;
      };

    };

  };

  ###### implementation

  config = let

    cfg = config.services.freefall;

    mkService = dev:
      assert dev != "";
      let dev' = utils.escapeSystemdPath dev; in
      nameValuePair "freefall-${dev'}" {
        description = "Free-fall protection for ${dev}";
        after = [ "${dev'}.device" ];
        wantedBy = [ "${dev'}.device" ];
        path = [ pkgs.freefall ];
        unitConfig = {
          DefaultDependencies = false;
        };
        serviceConfig = {
          ExecStart = "${pkgs.freefall}/bin/freefall ${dev}";
          Restart = "on-failure";
          Type = "forking";
        };
      };

  in mkIf cfg.enable {

    environment.systemPackages = [ pkgs.freefall ];

    systemd.services = listToAttrs (map mkService cfg.devices);

  };

}
