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

let
  inherit (lib) mkEnableOption mkOption types;

  cfg = config.my.programs.nix;
in
{
  options.my.programs.nix = {
    gc = {
      enable = mkEnableOption "nix-gc";
      minimumFreedGB = mkOption {
        default = 32;
        type = types.int;
        apply = number: toString (number * 1024 * 1024 * 1024);
      };
    };
    optimise.enable = mkEnableOption "nix-optimise";
  };

  config = {
    home-manager.users.moritz.programs.direnv.nix-direnv.package = pkgs.nix-direnv.override {
      nix = config.nix.package;
    };

    age.secrets.nix-github-token.file = ../../secrets/nix-github-token.age;

    nix = {
      nixPath = [ "nixpkgs=${inputs.nixpkgs}" ];

      package = pkgs.lix;

      extraOptions = ''
        !include ${config.age.secrets.nix-github-token.path}
        experimental-features = nix-command flakes
      '';

      gc = {
        automatic = cfg.gc.enable;
        options = "--max-freed ${cfg.gc.minimumFreedGB} --delete-older-than 14d";
        dates = "weekly";
      };

      optimise = {
        automatic = cfg.optimise.enable;
        dates = [ "weekly" ];
      };

      registry = {
        master-upstream.to = {
          type = "github";
          owner = "nixos";
          repo = "nixpkgs";
        };
        master.flake = inputs.master;
        nixpkgs.flake = inputs.nixpkgs;
        stable.flake = inputs.stable;
        dotfiles.flake = self;
        default.flake = self;
        d.flake = self;
      };

      settings = {
        substituters = [
          "https://cache.nixos.org?priority=1"
        ];
        trusted-public-keys = [
          "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
        ];

        trusted-users = [ "root" "@wheel" ];

        # https://bmcgee.ie/posts/2023/12/til-how-to-optimise-substitutions-in-nix/
        http-connections = 128;
        max-substitution-jobs = 128;
      };
    };
  };
}
