from statistics import mean
from typing import List

from src.infra.documents.models import DocumentInput, DocumentAnalysisResult
from src.infra.documents.ocr import analyze_legibility
from src.infra.documents.validation import validate_document
from src.infra.documents.coherence import check_coherence


def analyze_documents(
    documents: List[DocumentInput],
    declared_data: dict
) -> DocumentAnalysisResult:
    """
    Executa análise completa dos documentos e consolida sinais.
    """

    leg_scores = []
    val_scores = []
    coh_scores = []
    problemas: List[str] = []

    for doc in documents:
        leg_score, leg_probs, text = analyze_legibility(doc.file_path)
        leg_scores.append(leg_score)
        problemas.extend(leg_probs)

        val_score, val_probs = validate_document(text, doc.document_type)
        val_scores.append(val_score)
        problemas.extend(val_probs)

        coh_score, coh_probs = check_coherence(text, declared_data)
        coh_scores.append(coh_score)
        problemas.extend(coh_probs)

    return DocumentAnalysisResult(
        legibilidade_score=mean(leg_scores) if leg_scores else 0.0,
        validacao_score=min(val_scores) if val_scores else 0.0,
        coerencia_score=min(coh_scores) if coh_scores else 0.0,
        problemas=list(set(problemas))
    )
