case:
{ config, lib, ... }:

let
  homeDir = config.home.homeDirectory;

  histfileName = ".zsh_history";

  customHistRelPath = "some/subdir/${histfileName}";
  customHistAbsPath = "${homeDir}/${customHistRelPath}";

  # default option isn't exposed by submodule so this won't reflect
  # changes to the the module and may need to be updated in future
  defaultHistPath = "${homeDir}/${histfileName}";

  testPath =
    if case == "absolute" then
      customHistAbsPath
    else if case == "relative" then
      customHistRelPath
    else if case == "default" then
      defaultHistPath
    else if case == "xdg-variable" then
      "\${XDG_STATE_HOME:-\$HOME/.local/state}/zsh/history"
    else if case == "zdotdir-variable" then
      "\$ZDOTDIR/.zsh_history"
    else
      abort "Test condition not provided";

  expectedPath =
    if case == "default" then
      defaultHistPath
    else if case == "xdg-variable" then
      "\${XDG_STATE_HOME:-\$HOME/.local/state}/zsh/history"
    else if case == "zdotdir-variable" then
      "\$ZDOTDIR/.zsh_history"
    else
      customHistAbsPath;
in
{
  config = {
    programs.zsh = {
      enable = true;
      history.path = testPath;
      dotDir = lib.mkIf (case == "zdotdir-variable") "${homeDir}/.config/zsh";
    };

    test.stubs.zsh = { };

    test.asserts.warnings.expected = lib.optionals (case == "relative") [
      ''
        Using relative paths in programs.zsh.history.path is deprecated and will be removed in a future release.
        Consider using absolute paths or home-manager config options instead.
        You can replace relative paths or environment variables with options like:
        - config.home.homeDirectory (user's home directory)
        - config.xdg.configHome (XDG config directory)
        - config.xdg.dataHome (XDG data directory)
        - config.xdg.cacheHome (XDG cache directory)
        Current history.path: some/subdir/.zsh_history
      ''
    ];

    nmt.script =
      if case == "xdg-variable" then
        ''
          assertFileContains home-files/.zshrc 'HISTFILE="''${XDG_STATE_HOME:-''$HOME/.local/state}/zsh/history"'
        ''
      else if case == "zdotdir-variable" then
        ''
          assertFileContains home-files/.config/zsh/.zshrc 'HISTFILE="$ZDOTDIR/.zsh_history"'
          assertFileContains home-files/.config/zsh/.zshenv "export ZDOTDIR=\"${homeDir}/.config/zsh\""
        ''
      else
        ''
          assertFileRegex home-files/.zshrc '^HISTFILE="${expectedPath}"$'
        '';
  };
}
