# tests/test_bank_statement_phase2.py

import sys
import re
from datetime import datetime
from pathlib import Path

from src.infra.document_analysis.loaders.dispatcher import load_document
from src.infra.document_analysis.preprocess.text_cleaner import clean_text


DATE_RE = re.compile(r"\b\d{2}/\d{2}/\d{4}\b")

AMOUNT_RE = re.compile(
    r"(?<!\w)(\d{1,3}(?:[ .]\d{3})*(?:[.,]\d{2})|\d+(?:[.,]\d{2}))(?!\w)"
)


def normalize_amount(raw: str) -> float:
    raw = raw.replace(" ", "")
    if "." in raw and "," in raw:
        raw = raw.replace(".", "").replace(",", ".")
    elif "," in raw:
        raw = raw.replace(",", ".")
    try:
        return float(raw)
    except ValueError:
        return 0.0


def main():
    if len(sys.argv) < 2:
        print("❌ Caminho do extrato não informado.")
        sys.exit(1)

    file_path = Path(sys.argv[1])

    print("\n📄 Arquivo:", file_path)
    print("🔎 Iniciando leitura...\n")

    raw_text = load_document(str(file_path))
    text = clean_text(raw_text)

    print("🏦 DEBUG – SEGMENTAÇÃO POR DATAS")
    print("=" * 110)

    # -----------------------------
    # 1️⃣ Encontrar TODAS as datas
    # -----------------------------
    matches = list(DATE_RE.finditer(text))

    if len(matches) < 2:
        print("❌ Menos de duas datas encontradas. Não é possível segmentar.")
        sys.exit(0)

    print(f"📅 Datas detectadas: {len(matches)}\n")

    # -----------------------------
    # 2️⃣ Criar blocos entre datas
    # -----------------------------
    blocks = []

    for i in range(len(matches)):
        start = matches[i].start()
        end = matches[i + 1].start() if i + 1 < len(matches) else len(text)
        date_str = matches[i].group()

        try:
            date = datetime.strptime(date_str, "%d/%m/%Y")
        except ValueError:
            continue

        block_text = text[start:end]
        blocks.append((date, block_text.strip()))

    # -----------------------------
    # 3️⃣ Analisar cada bloco
    # -----------------------------
    balances = []

    for idx, (date, block) in enumerate(blocks, start=1):
        amounts_raw = AMOUNT_RE.findall(block)
        amounts = [normalize_amount(a) for a in amounts_raw if normalize_amount(a) > 0]

        print(f"\n🧾 TRANSAÇÃO {idx}")
        print("-" * 80)
        print(f"📅 Data: {date.strftime('%d/%m/%Y')}")
        print(f"📄 Texto do bloco (primeiros 300 chars):")
        print(block[:300].replace("\n", " ") + "...")
        print(f"💰 Valores encontrados: {amounts}")

        if amounts:
            saldo = max(amounts)
            balances.append((date, saldo))
            print(f"➡️ Saldo inferido: {saldo:,.2f}")
        else:
            print("⚠️ Nenhum valor monetário detectado.")

    # -----------------------------
    # 4️⃣ Fluxo simples (teste)
    # -----------------------------
    print("\n" + "=" * 110)
    print("📊 TESTE DE FLUXO (BASEADO EM SALDO)")
    print("=" * 110)

    if len(balances) < 2:
        print("❌ Dados insuficientes para análise de fluxo.")
        sys.exit(0)

    balances.sort(key=lambda x: x[0])

    total_creditos = 0.0
    total_debitos = 0.0

    prev = balances[0][1]

    for _, saldo in balances[1:]:
        delta = saldo - prev
        if delta > 0:
            total_creditos += delta
        elif delta < 0:
            total_debitos += abs(delta)
        prev = saldo

    print(f"➕ Total Créditos: {total_creditos:,.2f}")
    print(f"➖ Total Débitos:  {total_debitos:,.2f}")
    print(f"📈 Fluxo Líquido:  {(total_creditos - total_debitos):,.2f}")

    print("\n✅ FIM DO TESTE – FASE 2\n")


if __name__ == "__main__":
    main()
