{ config, lib, ... }:

with lib;

let releaseInfo = lib.importJSON ../../release.json;

in {
  options = {
    home.stateVersion = mkOption {
      type = types.enum [
        "18.09"
        "19.03"
        "19.09"
        "20.03"
        "20.09"
        "21.03"
        "21.05"
        "21.11"
        "22.05"
        "22.11"
        "23.05"
        "23.11"
        "24.05"
        "24.11"
        "25.05"
      ];
      description = ''
        It is occasionally necessary for Home Manager to change
        configuration defaults in a way that is incompatible with
        stateful data. This could, for example, include switching the
        default data format or location of a file.

        The *state version* indicates which default
        settings are in effect and will therefore help avoid breaking
        program configurations. Switching to a higher state version
        typically requires performing some manual steps, such as data
        conversion or moving files.
      '';
    };

    home.version = {
      full = mkOption {
        internal = true;
        readOnly = true;
        type = types.str;
        default = let
          inherit (config.home.version) release revision;
          suffix =
            optionalString (revision != null) "+${substring 0 8 revision}";
        in "${release}${suffix}";
        example = "22.11+213a0629";
        description = "The full Home Manager version.";
      };

      release = mkOption {
        internal = true;
        readOnly = true;
        type = types.str;
        default = releaseInfo.release;
        example = "22.11";
        description = "The Home Manager release.";
      };

      isReleaseBranch = mkOption {
        internal = true;
        readOnly = true;
        type = types.bool;
        default = releaseInfo.isReleaseBranch;
        description = ''
          Whether the Home Manager version is from a versioned
          release branch.
        '';
      };

      revision = mkOption {
        internal = true;
        type = types.nullOr types.str;
        default = let gitRepo = "${toString ./../..}/.git";
        in if pathIsGitRepo gitRepo then commitIdFromGitRepo gitRepo else null;
        description = ''
          The Git revision from which this Home Manager configuration was built.
        '';
      };
    };
  };
}