"""Bank-statement text extraction — no ID-as-amount bugs.

Uses fully synthetic sample text (not a real customer statement).
"""

from __future__ import annotations

from app.pdf.calc import calculate
from app.pdf.extract import (
    _extract_rows_from_hdfc_style_text,
    _is_plausible_txn_amount,
)


# Synthetic layout mirroring Indian bank PDF text (fake IDs / names / amounts).
SAMPLE = """
DEMO BANK Ltd. Page No .: 1
Statement of accounts
Cust ID : 100000001
JOINT HOLDERS : Account No :
12345678901234 DEMO ACCOUNT
Date Narration Chq./Ref.No. Value Dt Withdrawal Amt.
Deposit Amt. Closing Balance
01/05/26 UPI-MERCHANT ONE-PAYTMQRDEMO1@PTYS-YESB0PTMU
0000111111111111 01/05/26 90.00 34.74
PI-111111111111-UPI
01/05/26 UPI-MERCHANT TWO-PAYTMQRDEMO2@PAYTM-YESB0PTMU 0000111111111112
01/05/26 32.00 2.74
WPC5VS@PAYTM-YESB0PTMUPI-111111111112-UP
I
01/05/26 UPI-FRIEND A-PS000001-1@OKAXIS-DEMO0 0000222222222222
01/05/26 50.00 52.74
001395-222222222222-UPI
01/05/26 UPI-FRIEND B-PK000002-2@OKSBI-HD 0000111111111113
01/05/26 50.00 2.74
FC0001395-111111111113-UPI
03/05/26 UPI-FRIEND C-9000000000@SUPERYES-BAR
0000333333333333 03/05/26 500.00 502.74
B0DEMO-333333333333-PAID VIA SUPERMONE
07/05/26 NEFT CR-UTIB0000052-DEMO PAYROLL PV AXNH000000000001
07/05/26 500.00 1002.74
T LTD - DSCNBA-DEMO USER-AXNH000000000001
612
-650626429773-PAID VIA CRED AND
12345678901234 DEMO ACCOUNT
48190617795026207
"""


def test_plausible_amount_rejects_upi_rrn():
    assert _is_plausible_txn_amount(90.0) is True
    assert _is_plausible_txn_amount(8000.0) is True
    assert _is_plausible_txn_amount(-650626429773) is False
    assert _is_plausible_txn_amount(12345678901234) is False
    assert _is_plausible_txn_amount(48190617795026207) is False


def test_bank_sample_extracts_real_txns_not_ids():
    rows = _extract_rows_from_hdfc_style_text(SAMPLE)
    assert len(rows) == 6
    for r in rows:
        amt = r.debit or r.credit or 0
        assert amt < 10_000
    assert rows[0].debit == 90.0
    assert rows[1].debit == 32.0
    assert rows[2].credit == 50.0  # balance rose 2.74 → 52.74
    assert rows[3].debit == 50.0
    assert rows[4].credit == 500.0
    assert rows[5].credit == 500.0  # NEFT CR
    assert "NEFT CR" in (rows[5].description or "").upper()
    assert rows[1].description.startswith("UPI-MERCHANT TWO")


def test_bank_sample_totals_are_sane():
    rows = _extract_rows_from_hdfc_style_text(SAMPLE)
    calc = calculate(
        [
            {
                "description": r.description,
                "debit": r.debit,
                "credit": r.credit,
                "amount": r.amount,
                "date": r.date,
                "raw": r.raw,
            }
            for r in rows
        ],
        document_kind="bank_statement",
    )
    m = calc.get("metrics") or calc
    assert m["money_out"] == 172.0  # 90+32+50
    assert m["money_in"] == 1050.0  # 50+500+500
    assert m["money_out"] < 1_000_000
    assert m["money_in"] < 1_000_000
