"""§9 — Finance confidence template tags.

Covers ``rims_amount`` (split integer/decimal typography), ``rims_amount_dual``
(original + converted + FX rate provenance), and ``rims_data_footer``
(page-level as-of timestamp).
"""
from datetime import date, datetime, timezone as dt_tz
from decimal import Decimal

import pytest
from django.template import Context, Template

from apps.rims.finance.models import ExchangeRate


def _render(tpl_str, context=None):
    return Template("{% load rims_tags %}" + tpl_str).render(Context(context or {}))


@pytest.mark.django_db
def test_rims_amount_splits_int_and_decimal():
    out = _render("{% rims_amount 1234.56 'USD' %}")
    assert 'class="rims-amount"' in out
    assert "rims-amount__int" in out
    assert "1,234" in out
    assert ".56" in out
    assert ">USD<" in out


@pytest.mark.django_db
def test_rims_amount_handles_zero_decimals():
    out = _render("{% rims_amount 4200 'UGX' 0 %}")
    assert "4,200" in out
    assert ".00" not in out
    assert ">UGX<" in out


@pytest.mark.django_db
def test_rims_amount_handles_none_and_empty():
    """Defensive — list aggregates can be None on empty querysets."""
    out = _render("{% rims_amount value 'USD' %}", {"value": None})
    assert "0" in out
    out = _render("{% rims_amount '' 'USD' %}")
    assert "0" in out


@pytest.mark.django_db
def test_rims_amount_dual_renders_conversion_with_rate():
    ExchangeRate.objects.create(
        from_currency="USD",
        to_currency="UGX",
        rate=Decimal("3700.00"),
        effective_date=date(2026, 4, 1),
        source="BoU 2026-04-01",
    )
    out = _render(
        "{% rims_amount_dual 100 'USD' 'UGX' as_of=as_of %}",
        {"as_of": datetime(2026, 5, 1, tzinfo=dt_tz.utc)},
    )
    assert "rims-amount-dual" in out
    assert ">USD<" in out
    assert ">UGX<" in out
    # 100 * 3700 = 370,000
    assert "370,000" in out
    assert "BoU 2026-04-01" in out


@pytest.mark.django_db
def test_rims_amount_dual_falls_back_when_rate_missing():
    """No rate on file → render the original amount with a muted note
    rather than failing the page render."""
    out = _render("{% rims_amount_dual 50 'USD' 'EUR' %}")
    assert "FX rate unavailable" in out
    # Still renders the source amount.
    assert "50" in out


@pytest.mark.django_db
def test_rims_amount_dual_skips_when_currencies_match():
    out = _render("{% rims_amount_dual 200 'USD' 'USD' %}")
    # Same currency → no arrow, no dual wrapper.
    assert "rims-amount-dual" not in out
    assert "→" not in out


@pytest.mark.django_db
def test_rims_data_footer_renders_as_of_and_source():
    out = _render(
        '{% rims_data_footer as_of=as_of source="DisbursementRequest live data" fx_refreshed=fx %}',
        {
            "as_of": datetime(2026, 5, 17, 14, 32, tzinfo=dt_tz.utc),
            "fx": date(2026, 4, 1),
        },
    )
    assert 'class="rims-data-footer"' in out
    assert "As of 17 May 2026" in out
    assert "DisbursementRequest live data" in out
    assert "FX rates last refreshed" in out


@pytest.mark.django_db
def test_rims_data_footer_skips_when_nothing_to_say():
    out = _render('{% rims_data_footer %}')
    assert out.strip() == ""
