import sys
from pathlib import Path
from typing import List

from src.infra.document_analysis.analyzers.document_analyst import DocumentAnalyst
from src.app.pipeline import run_credit_pipeline


def resolve_files(path: str) -> List[str]:
    """
    Retorna lista de ficheiros a analisar
    a partir de um caminho (ficheiro ou diretório).
    """
    p = Path(path)

    if not p.exists():
        raise FileNotFoundError(f"Caminho não encontrado: {path}")

    if p.is_file():
        return [str(p)]

    if p.is_dir():
        files = [
            str(f)
            for f in p.iterdir()
            if f.is_file()
            and f.suffix.lower() in {
                ".pdf", ".docx", ".png", ".jpg", ".jpeg", ".webp", ".tif", ".tiff"
            }
        ]
        if not files:
            raise ValueError("Diretório não contém documentos suportados.")
        return files

    raise ValueError("Caminho inválido.")


def print_result(result):
    """Imprime resultado por documento (campos reais de DocumentAnalysisResult)."""
    print("\n" + "=" * 80)
    print(f"📄 DOCUMENTO: {result.document_id}")
    print("=" * 80)

    print(f"Tipo detectado (document_type_detected): {result.document_type_detected}")
    print(f"Confiança do tipo (document_type_confidence): {result.document_type_confidence:.2f}")

    print("\n⚠️ ALERTAS")
    if result.alerts:
        for alert in result.alerts:
            print(f"  - {alert}")
    else:
        print("  Nenhum alerta.")

    bf = (getattr(result, "features", {}) or {}).get("bank_statement_features")
    if bf:
        print("\n📊 BANK_STATEMENT_FEATURES (extrato bancário)")
        print(f"  analysis_status: {bf.get('analysis_status')}")
        print(f"  confidence: {bf.get('confidence')}")
        print(f"  period_days: {bf.get('period_days')}")
        print(f"  records_count: {bf.get('records_count')}")
        print(f"  total_creditos: {bf.get('total_creditos')}")
        print(f"  total_debitos: {bf.get('total_debitos')}")
        print(f"  fluxo_liquido: {bf.get('fluxo_liquido')}")
        print(f"  saldo_medio: {bf.get('saldo_medio')}")
        print(f"  saldo_minimo: {bf.get('saldo_minimo')}")
        print(f"  statement_score: {bf.get('statement_score')}")
        print(f"  recommended_max_by_term: {bf.get('recommended_max_by_term')}")
        reasons = bf.get("reasons") or []
        print("  reasons:")
        for r in reasons:
            print(f"    - {r}")

    print("\n🔍 SCORES")
    print(f"  Legibilidade:  {result.legibilidade_score:.2f}")
    print(f"  Estrutura:     {result.estrutura_score:.2f}")
    print(f"  Coerência:     {result.coerencia_score:.2f}")
    print(f"  Credibilidade: {result.credibilidade_score:.2f}")

    print("\n📌 ENTIDADES EXTRAÍDAS")
    if result.extracted_entities:
        for k, v in result.extracted_entities.items():
            print(f"  - {k}: {v}")
    else:
        print("  (nenhuma entidade encontrada)")

    print("=" * 80 + "\n")


def main():
    if len(sys.argv) < 2:
        print("Uso:")
        print("  python tests/teste2.py <ficheiro_ou_diretorio> [company_name] [nuit] [meses_atividade] [valor_credito] [prazo_dias]")
        sys.exit(1)

    input_path = sys.argv[1]
    company_name = sys.argv[2] if len(sys.argv) > 2 else "Teste Ltda"
    nuit = sys.argv[3] if len(sys.argv) > 3 else ""
    meses_atividade = int(sys.argv[4]) if len(sys.argv) > 4 else 12
    valor_credito = float(sys.argv[5]) if len(sys.argv) > 5 else 50000.0
    prazo_dias = int(sys.argv[6]) if len(sys.argv) > 6 else 30

    try:
        files = resolve_files(input_path)
    except Exception as e:
        print(f"Erro: {e}")
        sys.exit(1)

    print(f"\n📂 Documentos encontrados: {len(files)}")
    for f in files:
        print(f"  - {f}")

    analyst = DocumentAnalyst()
    print("\n🔎 Iniciando análise documental...\n")
    results = analyst.analyze_documents(files)

    for result in results:
        print_result(result)

    print("\n🔄 Executando pipeline end-to-end...\n")
    payload = run_credit_pipeline(
        files=files,
        input_company_name=company_name,
        input_nuit=nuit,
        input_meses_atividade=meses_atividade,
        faturamento_mensal=None,
        valor_credito=valor_credito,
        prazo_dias=prazo_dias,
    )

    decision_output = payload["decision"]
    risk = payload["risk"]
    score_output = payload["score"]

    print("=" * 80)
    print("SAÍDA FINAL DO PIPELINE")
    print("=" * 80)
    print(f"  score: {score_output.score}")
   # print(f"  risk_class: {risk.risk_class}")
    print(f"  decision: {decision_output.decision}")
    print(f"  approved_amount: {decision_output.approved_amount}")
    print(f"  flags: {decision_output.flags}")
    print("  reasons (finais):")
    for r in decision_output.reasons:
        print(f"    - {r}")
    print("=" * 80)

    print("\n✅ Análise e pipeline concluídos.\n")


if __name__ == "__main__":
    main()
