"""Stable licensing identifiers and bounded document limits."""

from __future__ import annotations

import re


PRODUCT_ID = "apolon.precision_lab_analyzer"
CANONICAL_PRODUCT_DIRECTORY = "PrecisionLabAnalyzer"
LICENSING_ORGANIZATION_DIRECTORY = "Apolon"

CATALOG_SCHEMA = "apolon.licensing.catalog"
CATALOG_LEGACY_SCHEMA_VERSION = 1
CATALOG_SCHEMA_VERSION = 2
CATALOG_SUPPORTED_SCHEMA_VERSIONS = frozenset(
    (CATALOG_LEGACY_SCHEMA_VERSION, CATALOG_SCHEMA_VERSION)
)
SNAPSHOT_SCHEMA = "apolon.licensing.entitlement-snapshot"
SNAPSHOT_SCHEMA_VERSION = 1
SIGNED_DOCUMENT_SCHEMA = "apolon.licensing.signed-document"
SIGNED_DOCUMENT_SCHEMA_VERSION = 1
SIGNED_DOCUMENT_ALGORITHM = "Ed25519"
SIGNED_DOCUMENT_DOMAIN = b"APOLON-LICENSE-SNAPSHOT-V1\x00"

MAX_SIGNED_DOCUMENT_BYTES = 1024 * 1024
MAX_CATALOG_DOCUMENT_BYTES = 2 * 1024 * 1024
MAX_SAFE_JSON_INTEGER = (1 << 53) - 1
MAX_IDENTIFIER_LENGTH = 128
MAX_DISPLAY_TEXT_LENGTH = 512
MAX_ENTITLEMENTS_PER_SNAPSHOT = 512
MAX_GRANT_SUMMARIES_PER_SNAPSHOT = 256
MAX_NONCE_LENGTH = 256
PRODUCT_SURFACE_POLICY_REQUIRED_CATALOG_REVISION = 4
TRIAL_MINIMUM_AUTHORITY_DURATION_HOURS = 1
TRIAL_MAXIMUM_TOTAL_DURATION_HOURS = 14 * 24

IDENTIFIER_PATTERN = re.compile(
    r"^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$"
)


def validate_identifier(value: object, field_name: str) -> str:
    """Return one normalized stable identifier or raise a precise error."""

    if not isinstance(field_name, str):
        raise TypeError("field_name must be a string")
    label = field_name.strip()
    if not label:
        raise ValueError("field_name must not be empty")
    if not isinstance(value, str):
        raise TypeError(f"{label} must be a string")
    normalized = value.strip()
    if not normalized:
        raise ValueError(f"{label} must not be empty")
    if len(normalized) > MAX_IDENTIFIER_LENGTH:
        raise ValueError(
            f"{label} exceeds the maximum length of {MAX_IDENTIFIER_LENGTH}"
        )
    if IDENTIFIER_PATTERN.fullmatch(normalized) is None:
        raise ValueError(f"{label} is not a valid stable identifier")
    return normalized


__all__ = [
    "CANONICAL_PRODUCT_DIRECTORY",
    "CATALOG_LEGACY_SCHEMA_VERSION",
    "CATALOG_SCHEMA",
    "CATALOG_SCHEMA_VERSION",
    "CATALOG_SUPPORTED_SCHEMA_VERSIONS",
    "IDENTIFIER_PATTERN",
    "LICENSING_ORGANIZATION_DIRECTORY",
    "MAX_CATALOG_DOCUMENT_BYTES",
    "MAX_DISPLAY_TEXT_LENGTH",
    "MAX_ENTITLEMENTS_PER_SNAPSHOT",
    "MAX_GRANT_SUMMARIES_PER_SNAPSHOT",
    "MAX_IDENTIFIER_LENGTH",
    "MAX_NONCE_LENGTH",
    "MAX_SAFE_JSON_INTEGER",
    "MAX_SIGNED_DOCUMENT_BYTES",
    "PRODUCT_ID",
    "PRODUCT_SURFACE_POLICY_REQUIRED_CATALOG_REVISION",
    "SIGNED_DOCUMENT_ALGORITHM",
    "SIGNED_DOCUMENT_DOMAIN",
    "SIGNED_DOCUMENT_SCHEMA",
    "SIGNED_DOCUMENT_SCHEMA_VERSION",
    "SNAPSHOT_SCHEMA",
    "SNAPSHOT_SCHEMA_VERSION",
    "TRIAL_MAXIMUM_TOTAL_DURATION_HOURS",
    "TRIAL_MINIMUM_AUTHORITY_DURATION_HOURS",
    "validate_identifier",
]
