"""Catálogo terminológico canónico versionado en el repositorio."""

from __future__ import annotations

import json
from pathlib import Path
from typing import Any

from app.clinical_pipeline.domain.models import CanonicalCatalogEntry


DEFAULT_CATALOG_PATH = Path(__file__).resolve().parents[1] / "catalogs" / "canonical_equivalences.json"


class CanonicalCatalog:
    """Carga entradas locales y evita que la normalización dependa de MongoDB."""

    def __init__(self, path: str | Path = DEFAULT_CATALOG_PATH) -> None:
        self.path = Path(path)
        self._entries = self._load()

    def _load(self) -> list[CanonicalCatalogEntry]:
        payload = json.loads(self.path.read_text(encoding="utf-8"))
        if not isinstance(payload, list):
            raise ValueError("El catálogo canónico debe contener una lista de entradas.")
        return [CanonicalCatalogEntry.model_validate(item) for item in payload]

    def entries(self, *, artifact_type: str | None = None) -> list[CanonicalCatalogEntry]:
        result = [entry for entry in self._entries if entry.active]
        if artifact_type:
            result = [entry for entry in result if artifact_type in entry.artifact_types]
        return result

    def as_documents(self) -> list[dict[str, Any]]:
        return [entry.to_document() for entry in self.entries()]

    @property
    def version(self) -> str:
        return max((entry.version for entry in self._entries), default="v1")

