"""Errores de dominio del procesamiento clínico."""

from app.clinical_pipeline.domain.models import (
    ProcessingFailureMetadata,
    ProcessingFailureSource,
)


class HistoriaSummaryCoverageError(RuntimeError):
    """Indica que no fue posible resumir con cobertura completa una historia extensa."""

    def __init__(
        self,
        message: str,
        *,
        failed_chunks: list[int] | None = None,
        stage: str = "historia_chunk_summary",
        attempts: int = 1,
        provider: str = "",
        model: str = "",
        error_kind: str = "",
        retryable: bool = False,
        source: ProcessingFailureSource = "internal",
    ) -> None:
        super().__init__(message)
        self.failed_chunks = list(failed_chunks or [])
        self.stage = str(stage or "historia_chunk_summary")
        self.attempts = max(1, int(attempts or 1))
        self.provider = str(provider or "")
        self.model = str(model or "")
        self.error_kind = str(error_kind or "")
        self.retryable = bool(retryable)
        self.source = source

    def to_failure_metadata(self) -> ProcessingFailureMetadata:
        external = self.source == "external_provider"
        external_temporary = external and self.retryable
        return ProcessingFailureMetadata(
            code="external_provider_temporarily_unavailable"
            if external_temporary
            else "historia_incomplete_coverage",
            source=self.source,
            stage=self.stage,
            retryable=self.retryable,
            provider=self.provider,
            model=self.model,
            error_kind=self.error_kind,
            public_title=(
                "Servicio externo temporalmente no disponible"
                if external_temporary
                else "Fallo del servicio externo de IA"
                if external
                else "No fue posible completar el procesamiento"
            ),
            public_message=(
                "El servicio externo de IA está temporalmente no disponible. "
                "El documento fue recibido correctamente y permanece guardado; "
                "no necesitas cargarlo nuevamente."
                if external_temporary
                else "El servicio externo de IA no pudo completar el procesamiento clínico."
                if external
                else "No fue posible completar el procesamiento clínico con cobertura total."
            ),
            failed_chunks=self.failed_chunks,
            attempts=self.attempts,
        )
