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

with lib;

let
  cfg = config.clerie.system-auto-upgrade;
in

{
  options = {
    clerie.system-auto-upgrade = {
      enable = mkEnableOption "clerie system upgrade";
      allowReboot = mkOption {
        type = types.bool;
        default = false;
        description = "Monitor NixOS";
      };
      autoUpgrade = mkOption {
        type = types.bool;
        default = false;
        description = "Automatically check and install upgrades";
      };
      startAt = mkOption {
        type = with types; nullOr str;
        default = null;
        description = "Systemd time string for starting the unit";
      };
    };
  };
  config = mkIf cfg.enable {
    systemd.services.clerie-system-auto-upgrade = {
      requires = [ "network-online.target" ];
      after = [ "network-online.target" ];

      # Make sure this unit does not stop themself while upgrading
      restartIfChanged = false;
      unitConfig.X-StopOnRemoval = false;

      serviceConfig = {
        Type = "oneshot";
        ExecStart = pkgs.clerie-system-upgrade + "/bin/clerie-system-upgrade --no-confirm${optionalString cfg.allowReboot " --allow-reboot"}${optionalString (config.clerie.monitoring.enable) " --node-exporter-metrics-path /var/lib/prometheus-node-exporter/textfiles/clerie-system-upgrade.prom"}";
      };
    };
    systemd.timers.clerie-system-auto-upgrade = mkIf cfg.autoUpgrade {
      wantedBy = [ "timers.target" ];
      timerConfig = {
        OnCalendar = if cfg.startAt == null then "*-*-* 05:37:00" else cfg.startAt;
        RandomizedDelaySec = if cfg.startAt == null then "2h" else "10m";
      };
      requires = [ "network-online.target" ];
      after = [ "network-online.target" ];
    };
    environment.systemPackages = with pkgs; [
      clerie-system-upgrade
    ];
  };
}