from __future__ import annotations

from jarvis_finance.services.budget_accounts import confirm_create_budget_account
from jarvis_finance.services.budget_categories import confirm_create_category
from jarvis_finance.services.budget_import_status import build_import_status_audit
from jarvis_finance.storage.database import connect_memory
from jarvis_finance.storage.migrations import apply_migrations


def db():
    conn = connect_memory()
    apply_migrations(conn)
    return conn


def insert_candidate(conn, cid: str, *, source_type: str, status: str = "pending", category_id: str | None = "cat-food", account_source: str | None = None, date: str = "2026-02-10") -> None:
    conn.execute(
        """
        INSERT INTO budget_transaction_candidates(
            transaction_candidate_id, source_file_label, source_row_or_range, source_type,
            transaction_date, description, merchant, amount_original, currency_original,
            proposed_category_id, proposed_category_name, confidence, requires_review, status,
            classification, review_reason, account_source, raw_fingerprint, created_at, updated_at
        ) VALUES (?, ?, ?, ?, ?, 'Test Merchant', 'Test Merchant', '0.00', 'CHF', ?,
            CASE WHEN ? IS NULL THEN NULL ELSE 'Food' END, '0.50', 1, ?, 'expense',
            'fixture', ?, ?, '2026-01-01T00:00:00', '2026-01-01T00:00:00')
        """,
        (cid, f"{source_type}.csv", cid, source_type, date, category_id, category_id, status, account_source, cid),
    )


def test_import_status_summary_counts_sources_statuses_and_quality_without_amounts() -> None:
    conn = db()
    category_id = confirm_create_category(conn, {"name": "Food", "category_type": "expense"})["entity_id"]
    account_id = confirm_create_budget_account(conn, {"name": "Budget", "account_type": "cash", "currency": "CHF"})["entity_id"]
    insert_candidate(conn, "visa-open", source_type="visa_credit_card", status="needs_review", category_id=None)
    insert_candidate(conn, "migros-confirmed", source_type="migros_receipt", status="confirmed", category_id=category_id)
    insert_candidate(conn, "akb-2025", source_type="akb_bank", status="reference_2025", category_id=None, date="2025-05-01")
    insert_candidate(conn, "raiff-dup", source_type="raiffeisen_bank", status="duplicate_candidate", category_id=None, account_source="CH00")
    conn.execute(
        """
        INSERT INTO budget_transactions(
            budget_transaction_id, account_id, transaction_type, transaction_date, description,
            amount_original, currency_original, amount_chf, fx_status, category_id, status, source_type,
            created_at, source_candidate_id
        ) VALUES ('tx1', ?, 'expense', '2026-02-10', 'Confirmed', '0.00', 'CHF', '0.00', 'not_needed', ?, 'confirmed', 'import_candidate', '2026-01-01T00:00:00', 'migros-confirmed')
        """,
        (account_id, category_id,),
    )
    conn.commit()

    summary = build_import_status_audit(conn)

    assert summary["sources"]["Kreditkarten-CSV"]["open_candidates"] == 1
    assert summary["sources"]["Migros-CSV"]["confirmed_candidates"] == 1
    assert summary["sources"]["AKB-CSV"]["wrong_year_or_2025_ref"] == 1
    assert summary["sources"]["Raiffeisen-CSV"]["duplicate_candidate_blocked"] == 1
    assert summary["quality"]["candidates_without_category"] == 2
    assert summary["quality"]["confirmed_transactions_without_category"] == 0
    assert "amount" not in repr(summary).lower()


def test_akb_raiffeisen_audit_reports_presence_without_fake_importing() -> None:
    conn = db()
    before = conn.execute("SELECT COUNT(*) FROM budget_transaction_candidates").fetchone()[0]

    summary = build_import_status_audit(conn)

    after = conn.execute("SELECT COUNT(*) FROM budget_transaction_candidates").fetchone()[0]
    assert after == before == 0
    assert summary["akb_raiffeisen"]["AKB"]["candidates"] == 0
    assert summary["akb_raiffeisen"]["Raiffeisen"]["effective_transactions"] == 0
    assert summary["akb_raiffeisen"]["csv_calculated_accounts"] == 0
    assert summary["akb_raiffeisen"]["csv_anchor_snapshots"] == 0
