"""Deterministic Core/Cloud semantic catalog contract and fingerprint."""
from __future__ import annotations

import hashlib
import json
from pathlib import Path
from typing import Any

CATALOG_SCHEMA_VERSION = 1
CATALOG_VERSION = 1
CATALOG_META_PATH = Path(__file__).parent.parent / "codegen" / "email_template_catalog.meta.json"

# Cloud runtime support is deliberately a projection of Core's wider catalog.
# Core-only platform emails must not be claimed as Cloud-generated-app support.
CLOUD_SUPPORTED_TEMPLATE_IDS = (
    "auth.verify_email",
    "auth.otp_request",
    "auth.magic_link",
    "auth.password_reset",
    "auth.invite",
    "contact_capture.admin_notify",
    "contact_capture.confirmation",
)

EMAIL_PROFILE_CONTRACT: dict[str, dict[str, Any]] = {
    "neutral": {"version": 1, "tone": "professional", "density": "comfortable", "branding": "application", "detail_layout": "structured"},
    "hospitality.standard": {"version": 1, "tone": "professional", "density": "compact", "branding": "application", "detail_layout": "structured"},
    "appointment.standard": {"version": 1, "tone": "professional", "density": "compact", "branding": "application", "detail_layout": "structured"},
    "commerce.standard": {"version": 1, "tone": "professional", "density": "compact", "branding": "application", "detail_layout": "structured"},
    "professional.standard": {"version": 1, "tone": "professional", "density": "comfortable", "branding": "application", "detail_layout": "structured"},
}


def _sorted_value(value: Any) -> Any:
    if isinstance(value, dict):
        return {key: _sorted_value(value[key]) for key in sorted(value)}
    if isinstance(value, (list, tuple)):
        return [_sorted_value(item) for item in value]
    return value


def canonical_catalog_payload() -> dict[str, Any]:
    raw = json.loads(CATALOG_META_PATH.read_text(encoding="utf-8"))
    templates = []
    for template_id in sorted(CLOUD_SUPPORTED_TEMPLATE_IDS):
        entry = raw[template_id]
        templates.append(
            {
                "id": template_id,
                "version": 1,
                "archetype": entry["archetype"],
                "default_profile": entry["default_profile"],
                "required_variables": sorted(entry["required_variables"]),
                "optional_variables": _sorted_value(entry["optional_variables"]),
            }
        )
    return _sorted_value(
        {
            "schema_version": CATALOG_SCHEMA_VERSION,
            "catalog_version": CATALOG_VERSION,
            "templates": templates,
            "profiles": EMAIL_PROFILE_CONTRACT,
        }
    )


def canonical_catalog_json() -> str:
    return json.dumps(canonical_catalog_payload(), ensure_ascii=False, separators=(",", ":"), sort_keys=True)


def catalog_fingerprint() -> str:
    return hashlib.sha256(canonical_catalog_json().encode("utf-8")).hexdigest()


def fingerprint_payload(payload: dict[str, Any]) -> str:
    """Fingerprint only contract fields; branding/runtime fields are ignored."""
    contract = {
        "schema_version": payload["schema_version"],
        "catalog_version": payload["catalog_version"],
        "templates": sorted(payload["templates"], key=lambda item: item["id"]),
        "profiles": payload["profiles"],
    }
    serialized = json.dumps(_sorted_value(contract), ensure_ascii=False, separators=(",", ":"), sort_keys=True)
    return hashlib.sha256(serialized.encode("utf-8")).hexdigest()
