from __future__ import annotations

from decimal import Decimal
from sqlite3 import Connection

from jarvis_finance.audit.log import record_audit_event
from jarvis_finance.fx.rates import _transaction_instruments_for_currency, upsert_fx_rate
from jarvis_finance.market_data.instruments import resolve_instrument_alerts


def set_manual_fx_override(
    conn: Connection,
    *,
    base_currency: str,
    quote_currency: str,
    rate_date: str,
    rate: Decimal,
    note: str,
    created_by: str = "system",
) -> str:
    if not note.strip():
        raise ValueError("manual FX override requires a note")
    rate_id = upsert_fx_rate(
        conn,
        base_currency=base_currency,
        quote_currency=quote_currency,
        rate_date=rate_date,
        rate=rate,
        provider="manual_override",
        rate_type="manual",
        quality_status="manual",
    )
    record_audit_event(
        conn,
        source="fx_overrides",
        action="manual_fx_override",
        entity_type="fx_rate",
        entity_id=rate_id,
        new_values={"base_currency": base_currency.upper(), "quote_currency": quote_currency.upper(), "rate_date": rate_date, "provider": "manual_override"},
        user_text_note=note,
        confirmed=True,
        created_by=created_by,
    )
    for inst_id in _transaction_instruments_for_currency(conn, base_currency):
        resolve_instrument_alerts(conn, instrument_id=inst_id, rule_ids=["missing_fx", "historical_fx_unavailable", "manual_override_required"])
    conn.commit()
    return rate_id
