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

let
  inherit (lib) mkEnableOption mkOption mkIf;

  cfg = config.dgn-console;
in
{
  options.dgn-console = {
    enable = mkEnableOption "DGNum console setup." // {
      default = true;
    };

    pg-upgrade-to = mkOption {
      type = lib.types.package;
      default = pkgs.postgresql_15;
    };
  };

  config = mkIf cfg.enable {
    time.timeZone = "Europe/Paris";

    console = {
      keyMap = "fr";
    };

    environment.variables.EDITOR = "nvim";

    programs.neovim.vimAlias = true;

    # services.nscd.enableNsncd = false;
    nixpkgs.overlays = [
      (_: _: {
        nsncd = pkgs.rustPlatform.buildRustPackage {
          pname = "nsncd";
          version = "unstable-2023-10-26";

          src = pkgs.fetchFromGitHub {
            owner = "nix-community";
            repo = "nsncd";
            rev = "47755a26ab3a45a47e55785eb112c817ba1e6bed";
            hash = "sha256-CSIFbCwXj33t7QW7PTqOXRcOYP/ivTWmK+s/xBZd0VQ=";
          };

          cargoSha256 = "sha256-cUM7rYXWpJ0aMiurXBp15IlxAmf/x5uiodxEqBPCQT0=";
        };
      })
    ];

    system.activationScripts.diff = {
      supportsDryActivation = true;
      text = ''
        ${pkgs.nvd}/bin/nvd --nix-bin-dir=${pkgs.nix}/bin diff /run/current-system "$systemConfig"
      '';
    };

    programs.bash.promptInit = ''
      FQDN="$(hostname).$(domainname)"
      # Provide a nice prompt if the terminal supports it.
      if [ "$TERM" != "dumb" ] || [ -n "$INSIDE_EMACS" ]; then
        PROMPT_COLOR="1;31m"
        ((UID)) && PROMPT_COLOR="1;32m"
        if [ -n "$INSIDE_EMACS" ] || [ "$TERM" = "eterm" ] || [ "$TERM" = "eterm-color" ]; then
          # Emacs term mode doesn't support xterm title escape sequence (\e]0;)
          PS1="\n\[\033[$PROMPT_COLOR\][\u@$FQDN:\w]\\$\[\033[0m\] "
        else
          PS1="\n\[\033[$PROMPT_COLOR\][\[\e]0;\u@\H: \w\a\]\u@$FQDN:\w]\\$\[\033[0m\] "
        fi
        if test "$TERM" = "xterm"; then
          PS1="\[\033]2;$FQDN:\u:\w\007\]$PS1"
        fi
      fi
    '';

    hardware.enableRedistributableFirmware = true;

    environment.systemPackages =
      (with pkgs; [
        neovim
        wget
        kitty.terminfo
      ])
      ++ lib.optional
        (config.services.postgresql.enable && config.services.postgresql.package != cfg.pg-upgrade-to)
        (
          pkgs.writeScriptBin "upgrade-pg-cluster" ''
            set -eux
            # XXX it's perhaps advisable to stop all services that depend on postgresql
            systemctl stop postgresql

            export NEWDATA="/var/lib/postgresql/${cfg.pg-upgrade-to.psqlSchema}"

            export NEWBIN="${cfg.pg-upgrade-to}/bin"

            export OLDDATA="${config.services.postgresql.dataDir}"
            export OLDBIN="${config.services.postgresql.package}/bin"

            install -d -m 0700 -o postgres -g postgres "$NEWDATA"
            cd "$NEWDATA"
            sudo -u postgres $NEWBIN/initdb -D "$NEWDATA"

            sudo -u postgres $NEWBIN/pg_upgrade \
              --old-datadir "$OLDDATA" --new-datadir "$NEWDATA" \
              --old-bindir $OLDBIN --new-bindir $NEWBIN \
              "$@"
          ''
        );
  };
}