{ config, pkgs, lib, inputs, ... }:
with lib;
{
  boot.tmp.cleanOnBoot = mkDefault true;
  boot.tmp.useTmpfs = mkDefault true;

  services.logrotate.enable = true;
  # NOTE: mostly useless on a server, and CPU intensive.
  documentation = {
    enable = mkDefault true;
    dev.enable = mkDefault false;
    doc.enable = mkDefault true;
    info.enable = mkDefault false;
    man.enable = mkDefault true;
    nixos.enable = mkDefault false;
  };
  programs.vim.defaultEditor = mkDefault true;
  programs.vim.enable = mkDefault true;
  environment.variables = {
    EDITOR = "vim";
    NIXPKGS_CONFIG = mkForce "";
    PAGER = "less -R";
    SYSTEMD_LESS = "FKMRX";
    # Setting TZ= avoids a lot of useless syscalls reading /etc/localtime
    # but requires to restart the session to change the time zone for all programs.
    TZ = lib.mkDefault (if config.time.timeZone != null then config.time.timeZone else "Europe/Paris");
  };
  home-manager.users.root = {
    imports = [
      ../../home-manager/options.nix
      ../../home-manager/profiles/essential.nix
    ];
    services.gpg-agent.pinentryPackage = pkgs.pinentry-curses;
  };
  nix = {
    settings.auto-optimise-store = mkDefault true;
    gc.automatic = mkDefault true;
    gc.dates = mkDefault "weekly";
    gc.options = mkDefault "--delete-older-than 7d";
    nixPath = mkForce [ ];
    # Pin the rev to the revision of the public Nixpkgs that the system was built from.
    # This is the version which will be locked by flakes using flake:nixpkgs
    #registry.nixpkgs = mkDefault { flake = inputs.nixpkgs; };
    registry.nixpkgs = {
      from = { id = "nixpkgs"; type = "indirect"; };
      to = {
        owner = "NixOS";
        repo = "nixpkgs";
        inherit (inputs.nixpkgs) rev;
        # May be overriden by nixos/modules/installer/cd-dvd/channel.nix
        type = mkDefault "github";
      };
    };
    package = pkgs.nixVersions.stable;
    settings.experimental-features = [ "nix-command" "flakes" ];
  };
  security.lockKernelModules = false;
  services.journald = {
    extraConfig = ''
      Compress=true
      MaxRetentionSec=1month
      Storage=persistent
      SystemMaxUse=100M
    '';
  };
  # none is the recommended elevator for SSD, whereas HDD could use mq-deadline.
  services.udev.extraRules = ''
    ACTION=="add|change", KERNEL=="sd[a-z][0-9]*", ATTR{../queue/rotational}=="0", ATTR{../queue/scheduler}="none"
    ACTION=="add|change", KERNEL=="nvme[0-9]*n[0-9]*p[0-9]*", ATTR{../queue/rotational}=="0", ATTR{../queue/scheduler}="none"
  '';
  systemd.oomd = {
    enable = mkDefault true;
    enableRootSlice = mkDefault true;
    enableSystemSlice = mkDefault true;
    enableUserSlices = mkDefault true;
  };
  systemd.services.sshd = {
    serviceConfig = {
      ManagedOOMPreference = "omit";
    };
  };
  /*
    system.nixos.versionSuffix = ".${
    substring 0 8 (inputs.self.lastModifiedDate or inputs.self.lastModified)}.${
    inputs.self.shortRev or "dirty"}";
    system.nixos.revision = mkIf (inputs.self ? rev) inputs.self.rev;
  */
  # Let 'nixos-version --json' know about the Git revision of this flake.
  system.configurationRevision = mkIf (inputs.self ? rev) inputs.self.rev;
  /*
    system.configurationRevision =
    if inputs.self ? rev
    then inputs.self.rev
    else throw "Refusing to build from a dirty Git tree!";
  */
  users.mutableUsers = false;
}