# src/infra/document_analysis/builders/profile_aggregator.py

from __future__ import annotations

from typing import List, Optional, Dict, Any

from src.infra.document_analysis.models.company_profile import CompanyProfile
from src.infra.document_analysis.builders.profile_builder import (
    build_profile_from_input,
)
from src.infra.document_analysis.schemas import DocumentAnalysisResult


def aggregate_company_profiles(
    *,
    document_results: List[DocumentAnalysisResult],
    input_data: Optional[Dict[str, Any]] = None,
) -> List[CompanyProfile]:
    """
    Agrega todos os CompanyProfile disponíveis a partir:
    - dos resultados da análise documental
    - do input do utilizador (opcional)

    NÃO valida, NÃO pontua, NÃO decide.
    """

    profiles: List[CompanyProfile] = []

    # -------------------------------------------------
    # 1) Perfis vindos dos documentos
    # -------------------------------------------------
    for r in document_results:
        if not r or not hasattr(r, "features"):
            continue

        profile = r.features.get("company_profile")

        if isinstance(profile, CompanyProfile):
            profiles.append(profile)

    # -------------------------------------------------
    # 2) Perfil vindo do input do utilizador
    # -------------------------------------------------
    if input_data:
        try:
            input_profile = build_profile_from_input(input_data)
            profiles.append(input_profile)
        except Exception:
            # input nunca deve quebrar o fluxo
            pass

    # -------------------------------------------------
    # 3) Limpeza defensiva
    # -------------------------------------------------
    clean_profiles = [
        p for p in profiles
        if p.company_name or p.nuit
    ]

    return clean_profiles
