from __future__ import annotations

from decimal import Decimal

import pytest

from jarvis_finance.audit.log import record_audit_event
from jarvis_finance.fx.conversion import convert_to_chf, get_fx_rate_to_chf, set_manual_fx_override
from jarvis_finance.storage.database import connect_memory
from jarvis_finance.storage.migrations import apply_migrations


def test_chf_to_chf_rate_is_one() -> None:
    assert get_fx_rate_to_chf(None, "CHF", "2026-01-01") == Decimal("1")
    assert convert_to_chf(Decimal("12.34"), "CHF", "2026-01-01", None) == Decimal("12.34")


def test_foreign_currency_requires_historical_rate_and_alerts_when_missing() -> None:
    conn = connect_memory()
    apply_migrations(conn)

    with pytest.raises(ValueError, match="Missing FX rate"):
        get_fx_rate_to_chf(conn, "USD", "2026-01-01")

    row = conn.execute("SELECT priority, category, rule_id FROM alerts").fetchone()
    assert row["priority"] == "kritisch"
    assert row["category"] == "fx"
    assert row["rule_id"] == "missing_fx"


def test_manual_fx_override_requires_note_and_audit() -> None:
    conn = connect_memory()
    apply_migrations(conn)

    with pytest.raises(ValueError, match="note"):
        set_manual_fx_override(conn, "USD", "2026-01-01", Decimal("0.90"), note="")

    audit_id = set_manual_fx_override(conn, "USD", "2026-01-01", Decimal("0.90"), note="Synthetic test override")
    assert audit_id
    assert get_fx_rate_to_chf(conn, "USD", "2026-01-01") == Decimal("0.90")
    audit = conn.execute("SELECT action, entity_type, user_text_note FROM audit_log WHERE audit_id=?", (audit_id,)).fetchone()
    assert audit["action"] == "manual_fx_override"
    assert audit["entity_type"] == "fx_rate"
    assert "Synthetic" in audit["user_text_note"]
