{ config, pkgs, ... }:
{
  # Delete all system generations except the 7 most recent ones.
  # Then delete all unreachable store objects.
  #
  # Based on https://github.com/NixOS/nixpkgs/blob/nixos-23.11/nixos/modules/services/misc/nix-gc.nix

  # Alternative: Delete generations older than 7 days and then delete unreachable store objects
  # https://nixos.wiki/wiki/Storage_optimization#Automation
  #nix.gc = {
  #  automatic = true;
  #  dates = "weekly";
  #  options = "--delete-older-than 7d";
  #};

  assertions = [{
    assertion = config.nix.enable;
    message = ''nix-gc-7 requires nix.enable'';
  }];

  systemd.timers."nix-gc-7" = {
    wantedBy = [ "timers.target" ];
    partOf = [ "nix-gc-7.service" ];
    timerConfig = {
      OnCalendar = "weekly";
      Persistent = true;

      AccuracySec = "2d";
      RandomizedDelaySec = "1d";
    };
  };

  # View generated systemd service config with:
  #   cat "$(systemctl show -P FragmentPath nix-gc-7.service)" | grep ExecStart
  systemd.services."nix-gc-7" = {
    description = "rm old system generations and unreachable store objects";

    conflicts = [ "shutdown.target" "sleep.target" ];
    before = [ "shutdown.target" "sleep.target" ];

    serviceConfig = {
      Type = "oneshot";
      PrivateTmp = true;

      Nice = 19;
      IOSchedulingClass = "idle";
    };

    script = ''
      ${config.nix.package.out}/bin/nix-env --delete-generations +7 --profile /nix/var/nix/profiles/system
      ${config.nix.package.out}/bin/nix-collect-garbage
    '';
  };
}