from __future__ import annotations

import json
from pathlib import Path

from jarvis_gateway.adapters.finance_sanitizer import assert_no_sensitive_finance_output, sanitize_finance_payload

FIXTURES = Path(__file__).parent / "fixtures" / "finance_live_synthetic"


def load(name: str):
    return json.loads((FIXTURES / name).read_text(encoding="utf-8"))


def synthetic_live_payload() -> dict:
    return {
        "health": load("health.json"),
        "provider/status": load("provider_status.json"),
        "runtime/status": load("runtime_status.json"),
        "budget/import-status-audit": load("import_status_audit.json"),
    }


def test_realistic_synthetic_response_maps_to_safe_module_snapshot() -> None:
    snapshot = sanitize_finance_payload(synthetic_live_payload())
    payload = snapshot.model_dump(mode="json")
    assert payload["module_id"] == "finance"
    assert payload["source_health"]["source_type"] == "http_api"
    assert payload["display_policy"] == "summary"
    review_kpi = next(kpi for kpi in payload["kpis"] if kpi["key"] == "review_items")
    assert review_kpi["value"] == 3
    assert_no_sensitive_finance_output(payload)


def test_unknown_and_sensitive_fields_are_ignored() -> None:
    dirty = load("dirty_sensitive_response.json")
    payload = synthetic_live_payload()
    payload["budget/import-status-audit"] = {**payload["budget/import-status-audit"], "unknown_blob": dirty}
    snapshot = sanitize_finance_payload(payload)
    rendered = str(snapshot.model_dump(mode="json")).lower()
    for forbidden in ["synthetic account", "synthetic transaction", "12345", "finance.sqlite", "synthetic-token", "api_key", "portfolio"]:
        assert forbidden not in rendered


def test_all_problematic_endpoint_shapes_still_return_safe_snapshot() -> None:
    dirty = load("dirty_sensitive_response.json")
    snapshot = sanitize_finance_payload({
        "health": dirty,
        "provider/status": [dirty],
        "runtime/status": dirty,
        "budget/import-status-audit": dirty,
    })
    payload = snapshot.model_dump(mode="json")
    assert payload["module_id"] == "finance"
    assert_no_sensitive_finance_output(payload)
