{
  config,
  lib,
  pkgs,
  ...
}:
let
  inherit (lib) mkOption types;

  cfg = config.programs.pet;

  format = pkgs.formats.toml { };

  snippetType = types.submodule {
    options = {
      description = mkOption {
        type = types.str;
        default = "";
        example = "Count the number of commits in the current branch";
        description = ''
          Description of the snippet.
        '';
      };

      command = mkOption {
        type = types.str;
        default = "";
        example = "git rev-list --count HEAD";
        description = ''
          The command.
        '';
      };

      output = mkOption {
        type = types.str;
        default = "";
        example = "473";
        description = ''
          Example output of the command.
        '';
      };

      tag = mkOption {
        type = types.listOf types.str;
        default = [ ];
        example = lib.literalExpression ''["git" "nixpkgs"]'';
        description = ''
          List of tags attached to the command.
        '';
      };
    };
  };

in
{
  options.programs.pet = {
    enable = lib.mkEnableOption "pet";

    package = lib.mkPackageOption pkgs "pet" { nullable = true; };

    settings = mkOption {
      inherit (format) type;
      default = { };
      description = ''
        Settings written to {file}`config.toml`. See the pet
        documentation for details.
      '';
    };

    selectcmdPackage = lib.mkPackageOption pkgs "fzf" {
      nullable = true;
      extraDescription = "The package needed for the {var}`settings.selectcmd`.";
    };

    snippets = mkOption {
      type = types.listOf snippetType;
      default = [ ];
      description = ''
        The snippets.
      '';
    };
  };

  config = lib.mkIf cfg.enable {
    programs.pet.settings =
      let
        defaultGeneral = {
          selectcmd = lib.mkDefault "fzf";
          snippetfile = config.xdg.configHome + "/pet/snippet.toml";
        };
      in
      if lib.versionAtLeast config.home.stateVersion "21.11" then
        {
          General = defaultGeneral;
        }
      else
        defaultGeneral;

    home.packages =
      lib.optional (cfg.package != null) cfg.package
      ++ lib.optional (cfg.selectcmdPackage != null) cfg.selectcmdPackage;

    xdg.configFile = {
      "pet/config.toml".source = format.generate "config.toml" (
        if lib.versionAtLeast config.home.stateVersion "21.11" then
          cfg.settings
        else
          {
            General = cfg.settings;
          }
      );
      "pet/snippet.toml" = lib.mkIf (cfg.snippets != [ ]) {
        source = format.generate "snippet.toml" { inherit (cfg) snippets; };
      };
    };
  };
}
