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

let
  zshrc = pkgs.writeTextFile {
    name = ".zshrc";
    text = ''
      # Lines configured by zsh-newuser-install
      HISTFILE=~/.zhistory
      HISTSIZE=100000
      SAVEHIST=100000
      setopt appendhistory notify
      unsetopt beep
      bindkey -e
      # End of lines configured by zsh-newuser-install
      # The following lines were added by compinstall
      #

      # Use menu complete immediately instead of after the first tab
      setopt MENU_COMPLETE

      zstyle :compinstall filename "$HOME/.zshrc"

      autoload -Uz compinit
      compinit
      # End of lines added by compinstall

      # Enable the 2d menu for tab completion
      zstyle ':completion:*' menu select

      autoload colors zsh/terminfo
      if [[ "$terminfo[colors]" -ge 8 ]]; then
          colors
      fi
      for color in RED GREEN YELLOW BLUE MAGENTA CYAN WHITE; do
          eval PR_$color='%{$terminfo[bold]$fg[''${(L)color}]%}'
          eval PR_LIGHT_$color='%{$fg[''${(L)color}]%}'
          (( count = $count + 1 ))
      done
      PR_NO_COLOR="%{$terminfo[sgr0]%}"
      PS1="[$PR_BLUE%n$PR_WHITE@$PR_GREEN%U%m%u$PR_NO_COLOR:$PR_RED%2c$PR_NO_COLOR]%(!.#.$) "

      source ${pkgs.zsh-histdb}/share/zsh/plugins/zsh-histdb/sqlite-history.zsh
      autoload -Uz add-zsh-hook

      source ${pkgs.zsh-histdb}/share/zsh/plugins/zsh-histdb/histdb-interactive.zsh
      bindkey '^r' _histdb-isearch

      ${lib.concatMapStringsSep "\n" (item: "source ${item}") config.me.zsh.includes}
    '';
  };
in
{
  imports = [ ];

  options.me = {
    zsh.enable = lib.mkOption {
      type = lib.types.bool;
      default = false;
      example = true;
      description = "Whether we want to install zsh.";
    };
    zsh.includes = lib.mkOption {
      type = lib.types.listOf lib.types.package;
      default = [ ];
      example = lib.literalExpression ''
        [ (pkgs.writeTextFile {
            name = "launch-kanshi.conf";
            text = "exec kanshi";
          }) ]'';
      description = "List of zshrc files to import.";
    };
  };

  config = lib.mkIf config.me.zsh.enable {
    environment.systemPackages = with pkgs; [
      zsh
    ];

    users.users.talexander.shell = pkgs.zsh;
    environment.shells = with pkgs; [ zsh ];

    programs.zsh = {
      enable = true;
    };

    me.install.user.talexander.file = {
      ".zshrc" = {
        source = "${zshrc}";
      };
    };

    environment.persistence."/persist" = lib.mkIf (config.me.mountPersistence) {
      hideMounts = true;
      users.talexander = {
        directories = [
          {
            directory = ".histdb";
            user = "talexander";
            group = "talexander";
            mode = "0700";
          }
        ];
      };
    };

    nixpkgs.overlays = [
      (final: prev: {
        zsh-histdb = (final.callPackage ./package/zsh-histdb/package.nix { });
      })
    ];
  };
}
