{ config, configName, depot, lib, pkgs, ... }:
let
  inherit (pkgs.stdenv.hostPlatform) isDarwin isLinux;
in
{
  imports = [ ./ntfy.nix ];

  programs.ntfy = {
    enable = true;
    package = if isDarwin then pkgs.ntfy.overrideAttrs (oldAttrs: {
      postPatch = ''
        substituteInPlace setup.py \
          --replace '"darwin"' '"darwin-disabled"'
      '';
    }) else pkgs.ntfy;
    settings = {
      backends = [ "pushover" ];
      pushover = {
        user_key = depot.ops.secrets.pushover.userKey;
        api_token = depot.ops.secrets.pushover.tokens.depot;
      };
    };
  };

  home.username = "lukegb";
  home.homeDirectory = if isDarwin then "/Users/lukegb" else "/home/lukegb";
  home.file = {
    ".hgrc".source = ./hgrc;
  };
  home.sessionVariables = {
    EDITOR = "vim";
    VISUAL = "vim";
  };

  programs.ssh = {
    enable = true;
    forwardAgent = true;
    matchBlocks = let
      allEventBlocks = (lib.concatStringsSep " " (builtins.map (n: "172.${toString n}.*.*") (lib.range 16 31)));
      blast-tmpl = ip: {
        user = "root";
        port = 888;
        hostname = ip;
        extraOptions.setEnv = "TERM=xterm-256color";
      };
    in ({
      sar1 = {
        hostname = "172.16.0.1";
        extraOptions.setEnv = "TERM=xterm-256color";
      };
      su-cinema-ernie = {
        user = "lukegb";
        hostname = "su-cinema-ernie.su.ic.ac.uk";
        port = 8080;
      };
      su-cinema-ernie-root = {
        user = "root";
        hostname = "su-cinema-ernie.su.ic.ac.uk";
        port = 8080;
      };

      blast-worker1 = blast-tmpl "10.200.109.10";
      blast-worker2 = blast-tmpl "10.200.109.11";
      blast-csgo1 = blast-tmpl "10.200.109.12";
      blast-csgo2 = blast-tmpl "10.200.109.13";

      whitby = {
        hostname = "whitby.tvl.fyi";
      };
      github = {
        user = "git";
        hostname = "github.com";
        identityFile = "~/.ssh/keys/github";
      };
    } // (builtins.listToAttrs [
      {
        name = allEventBlocks;
        value = {
          extraOptions.setEnv = "TERM=xterm-256color";
        };
      }
    ]));
  };

  programs.bash = {
    enable = true;
    enableVteIntegration = !isDarwin;

    initExtra = ''
      function join_by { local IFS="$1"; shift; echo "$*"; }

      if [[ -z "$LAUNCH_SHLVL" ]]; then
        export LAUNCH_SHLVL="$SHLVL"
      fi
      export LAUNCH_DEPTH="$(expr $SHLVL - $LAUNCH_SHLVL)"
      export LAUNCH_DEPTH_STR=""
      if [[ "$LAUNCH_DEPTH" > 0 ]]; then
        if [[ "$PATH" == /nix/store/* ]]; then
          declare -a RECENT_PKGS
          while read -rd: pathseg; do
            if [[ "$pathseg" != /nix/store/* ]]; then
              break
            fi
            RECENT_PKGS+=("$(echo "$pathseg" | sed -E -e 's,^/nix/store/[a-z0-9]+-,,' -e 's,/.*$,,' -e 's,-[0-9.]+$,,')")
          done <<< $PATH
          RECENT_PKG="$(join_by ":" "''${RECENT_PKGS[@]}")"
          if [[ "''${#RECENT_PKG}" > 32 ]]; then
            RECENT_PKGS="''${RECENT_PKGS[0]}"
          fi
          if [[ ! -z "$RECENT_PKG" ]]; then
            LAUNCH_DEPTH_STR="[$RECENT_PKG] "
          fi
        fi
        if [[ -z "$LAUNCH_DEPTH_STR" ]]; then
          LAUNCH_DEPTH_STR="[$LAUNCH_DEPTH] "
        fi
      fi
      export PS1="\n\[\033[1;32m\]$LAUNCH_DEPTH_STR[\[\e]0;\u@\h: \w\a\]\u@\h:\w]\$ \[\033[0m\]"
    '';
  };
  programs.vim.enable = true;
  programs.vim.packageConfigurable = pkgs.vim_configurable.override {
    guiSupport = false;
  };

  home.packages = (with pkgs; ([
    ripgrep
    whois
    dnsutils
  ] ++ lib.optionals (configName != null) [
    # This only applies to "external" users of this config.
    (writeShellScriptBin "home-manager" ''
      #!/bin/sh
      exec "${home-manager}/bin/home-manager" -f "${config.home.homeDirectory}/depot/home-manager-ext.nix" -A "${configName}" "$@"
    '')
    rxvt-unicode-unwrapped.terminfo tmux rsync libarchive tcpdump restic
    alacritty.terminfo kitty.terminfo
    iftop htop jq
    depot.nix.pkgs.mercurial
  ] ++ lib.optionals isLinux [
    iotop
  ]));

  # No manuals.
  manual.manpages.enable = false;
  manual.json.enable = false;
  manual.html.enable = false;

  home.stateVersion = "20.09";
}