"""Normalización determinista de candidatos CUPS quirúrgicos."""

from __future__ import annotations

import re
from typing import Any

from app.soat_crosswalk.infrastructure.catalogs import XlsxCupsCatalog


CUPS_CODE_PATTERN = re.compile(r"(?<!\d)(\d{6})(?!\d)")


def _codes(value: Any) -> list[str]:
    return list(dict.fromkeys(CUPS_CODE_PATTERN.findall(str(value or ""))))


def normalize_cups_candidates(
    candidates: list[dict[str, Any]] | None,
    *,
    explicit_candidates: list[dict[str, Any]] | None = None,
    catalog: XlsxCupsCatalog | None = None,
) -> list[dict[str, str]]:
    """Separa códigos, valida contra el catálogo y conserva una fila por código.

    Los candidatos explícitos del documento se procesan primero, de modo que una
    alternativa recuperada no pueda reemplazar su código ni duplicarlo.
    """

    cups_catalog = catalog or XlsxCupsCatalog()
    result: list[dict[str, str]] = []
    seen: set[str] = set()

    def add(item: dict[str, Any], *, explicit: bool) -> None:
        raw_code = item.get("codigo_cups") or item.get("codigo")
        codes = _codes(raw_code)
        if not codes and explicit:
            codes = _codes(item.get("procedimiento") or item.get("descripcion"))[:1]
        for code in codes:
            if code in seen or not cups_catalog.contains(code):
                continue
            description = cups_catalog.description(code) or ""
            if not description:
                continue
            result.append({"codigo_cups": code, "procedimiento": description})
            seen.add(code)

    for item in explicit_candidates or []:
        if isinstance(item, dict):
            add(item, explicit=True)
    for item in candidates or []:
        if isinstance(item, dict):
            add(item, explicit=False)
    return result
