import pytest

from app.services.catalog.fx import to_reference_cents


def test_same_currency_needs_no_rate(monkeypatch):
    import app.services.catalog.fx as mod
    monkeypatch.setattr(mod, "get_rate", lambda b, q: None)  # never consulted
    assert to_reference_cents(88595, "INR", "INR") == (88595, 1.0)


def test_converts_with_the_stored_rate(monkeypatch):
    import app.services.catalog.fx as mod
    monkeypatch.setattr(mod, "get_rate", lambda b, q: 0.012)
    converted, rate = to_reference_cents(88595, "INR", "USD")
    assert converted == 1063          # round(88595 * 0.012)
    assert rate == 0.012


def test_missing_rate_returns_none_rather_than_guessing(monkeypatch):
    # A guessed rate produces confident, wrong recommendations. A null makes the
    # product incomplete, which is visible.
    import app.services.catalog.fx as mod
    monkeypatch.setattr(mod, "get_rate", lambda b, q: None)
    assert to_reference_cents(88595, "INR", "USD") == (None, None)


@pytest.mark.parametrize("price,src,ref", [
    (None, "INR", "USD"),
    (1000, None, "USD"),
    (1000, "INR", None),
])
def test_missing_inputs_return_none(price, src, ref):
    assert to_reference_cents(price, src, ref) == (None, None)


def test_conversion_stays_an_integer(monkeypatch):
    import app.services.catalog.fx as mod
    monkeypatch.setattr(mod, "get_rate", lambda b, q: 0.0123456)
    converted, _ = to_reference_cents(99999, "INR", "USD")
    assert isinstance(converted, int)
