{ config
, pkgs
, lib
, ...
}: {
  nixpkgs.overlays = [
    (self: super: {
      darwin-zsh-completions =
        super.runCommand "darwin-zsh-completions-0.0.0"
          {
            preferLocalBuild = true;
          } ''
          mkdir -p $out/share/zsh/site-functions
          cat <<-'EOF' > $out/share/zsh/site-functions/_darwin-rebuild
          #compdef darwin-rebuild
          #autoload
          _nix-common-options
          local -a _1st_arguments
          _1st_arguments=(
          'switch:Build, activate, and update the current generation'\
          'build:Build without activating or updating the current generation'\
          'check:Build and run the activation sanity checks'\
          'changelog:Show most recent entries in the changelog'\
          )
          _arguments \
          '--list-generations[Print a list of all generations in the active profile]'\
          '--rollback[Roll back to the previous configuration]'\
          {--switch-generation,-G}'[Activate specified generation]'\
          '(--profile-name -p)'{--profile-name,-p}'[Profile to use to track current and previous system configurations]:Profile:_nix_profiles'\
          '1:: :->subcmds' && return 0
          case $state in
          subcmds)
          _describe -t commands 'darwin-rebuild subcommands' _1st_arguments
          ;;
          esac
          EOF
        '';
    })

  ];
  home.packages = with pkgs; [
    darwin-zsh-completions
    darwin.trash
  ];

  programs.emacs.package = pkgs.emacs;

  home.file.".hushlogin".text = "";

  services.syncthing = {
    enable = true;
  };

  launchd.agents = {
    home-manager-expire-generations = {
      enable = true;

      config = {
        ProgramArguments = [
          "${pkgs.home-manager}/bin/home-manager"
          "expire-generations"
          "-30 days"
        ];
        KeepAlive = false;
        RunAtLoad = false;
        StartCalendarInterval = [{
          Hour = 12;
          Minute = 00;
          Weekday = 6; # Saturday
        }];
        ProcessType = "Background";
        LowPriorityBackgroundIO = true;
      };
    };
    set-xdg-cache-home = {
      enable = true;

      config = {
        ProgramArguments = [
          "/bin/launchctl"
          "setenv"
          "XDG_CACHE_HOME"
          config.xdg.cacheHome
        ];
        RunAtLoad = true;
        StandardErrorPath = "/dev/null";
        StandardOutputPath = "/dev/null";
      };
    };
    dark-light-mode = {
      enable = true;
      config = {
        WatchPaths = [ "${config.home.homeDirectory}/Library/Preferences/.GlobalPreferences.plist" ];
        StandardOutputPath = "/dev/null";
        StandardErrorPath = "/dev/null";
        RunAtLoad = true;
        KeepAlive = false;
        ProgramArguments = [
          "/bin/sh"
          (
            toString
              (
                pkgs.writeShellScript
                  "toggle-dark-light-mode"
                  ''
                    wait4path /nix
                    if defaults read -g AppleInterfaceStyle &>/dev/null ; then
                      MODE="dark"
                    else
                      MODE="light"
                    fi
                    emacsclient="${config.programs.emacs.finalPackage}/bin/emacsclient"
                    emacsSwitchTheme () {
                      if pgrep -q Emacs; then
                        if [[  $MODE == "dark"  ]]; then
                            $emacsclient --eval "(modus-themes-load-theme (cadr modus-themes-to-toggle))" \
                              --eval "(modify-all-frames-parameters '((ns-appearance '$MODE)))"
                        elif [[  $MODE == "light"  ]]; then
                            $emacsclient --eval "(modus-themes-load-theme (car modus-themes-to-toggle))" \
                              --eval "(modify-all-frames-parameters '((ns-appearance '$MODE)))"
                        fi
                      fi
                    }
                    emacsSwitchTheme $@
                  ''
              )
          )
        ];
      };
    };
  };

  programs.zsh.shellAliases = {
    rb = "darwin-rebuild";
    rbs = "darwin-rebuild switch --flake $(ghq list -p nixfiles)";

    dig = "dig +noall +answer";
  };

  programs.zsh.envExtra = ''
    SHELL_SESSIONS_DISABLE=1
    path+=($HOME/Library/Python/3.9/bin)
  '';
  programs.ssh.extraConfig = ''
    IdentityAgent ~/.strongbox/agent.sock
  '';
  home.activation.linkStrongboxSSHAgentSocket = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
    if [[ ! -d ~/.strongbox ]]
    then
      $DRY_RUN_CMD mkdir ~/.strongbox
    fi
    if [[ ! -S ~/.strongbox/agent.sock ]]
    then
      $DRY_RUN_CMD ln -s $VERBOSE_ARG \
        ~/Library/Group\ Containers/group.strongbox.mac.mcguill/agent.sock ~/.strongbox/agent.sock
    fi
  '';

  # Use GPG from  GPGTools
  programs.git.signing.gpgPath = "/usr/local/bin/gpg";
}