"""Puertos del pipeline clínico."""

from __future__ import annotations

from collections.abc import Sequence
from typing import Any, Protocol

from app.clinical_pipeline.domain.models import (
    CanonicalAssociationDecision,
    CanonicalCatalogEntry,
    CanonicalOccurrence,
)


class CanonicalTextMatcher(Protocol):
    """Localiza términos clínicos sin acoplar el caso de uso a un algoritmo."""

    def find_occurrences(
        self,
        document_pages: Sequence[Any],
        candidates: Sequence[CanonicalCatalogEntry | dict[str, Any] | str],
        context: dict[str, Any] | None = None,
    ) -> list[CanonicalOccurrence]: ...


class CanonicalAssociationResolver(Protocol):
    """Decide whether a generated canonical candidate is publishable."""

    def resolve(
        self,
        occurrence: CanonicalOccurrence,
        candidates: Sequence[CanonicalCatalogEntry],
        context: dict[str, Any] | None = None,
    ) -> CanonicalAssociationDecision: ...

__all__ = ["CanonicalAssociationResolver", "CanonicalTextMatcher"]
