{ pkgs, ... }:

let
  inherit (pkgs) writeShellScript;
  inherit (pkgs.lib.strings) makeBinPath;
in
{
  install = writeShellScript "install-configs" ''
    cd "$WPCARRO/configs" && ${pkgs.stow}/bin/stow --target="$HOME" .
  '';

  uninstall = writeShellScript "uninstall-configs" ''
    cd "$WPCARRO/configs" && ${pkgs.stow}/bin/stow --delete --target="$HOME" .
  '';

  # Run this script to import all of the information exported by `export.sh`.
  # Usage: import-gpg path/to/export.zip
  import-gpg = writeShellScript "import-gpg" ''
    set -euo pipefail

    if [ -z "''${1+x}" ]; then
      echo "You must specify the path to export.zip. Exiting..."
      exit 1
    fi

    PATH="${makeBinPath (with pkgs; [ busybox gnupg ])}"
    destination="$(mktemp -d)"

    function cleanup() {
      rm -rf "$destination"
    }
    trap cleanup EXIT

    unzip "$1" -d "$destination" >/dev/null

    gpg --import "$destination/public.asc"
    gpg --import "$destination/secret.asc"
    gpg --import-ownertrust "$destination/ownertrust.txt"

    # Run this at the end to output some verification
    gpg --list-keys
    gpg --list-secret-keys
  '';

  # Run this script to export all the information required to transport your GPG
  # information to a zip file.
  # Usage: export-gpg
  export-gpg = writeShellScript "export-gpg" ''
    set -euo pipefail

    PATH="${makeBinPath (with pkgs; [ busybox gnupg zip ])}"
    output="$(pwd)/export.zip"
    destination="$(mktemp -d)"

    function cleanup() {
      rm -rf "$destination"
    }
    trap cleanup EXIT

    gpg --armor --export >"$destination/public.asc"
    gpg --armor --export-secret-keys >"$destination/secret.asc"
    gpg --armor --export-ownertrust >"$destination/ownertrust.txt"

    # Strangely enough this appears to be the only way to create a zip of a
    # directory that doesn't contain the (noisy) full paths of each item from
    # the source filesystem. (i.e. -j doesn't cooperate with -r).
    pushd "$destination"
    zip -r "$output" ./*
    popd

    echo "$(realpath $output)"
  '';
}
