from __future__ import annotations

from datetime import date, datetime

from apps.core.utils.formatters import (
    RAG_LABELS,
    format_currency,
    format_date,
    format_percent,
    rag_label,
    truncate,
)


def test_rag_label_maps_known_statuses():
    assert rag_label("green") == RAG_LABELS["green"]
    assert rag_label("AMBER") == RAG_LABELS["amber"]  # case-insensitive
    assert rag_label("red") == RAG_LABELS["red"]


def test_rag_label_falls_back_to_unknown():
    assert rag_label(None) == RAG_LABELS["unknown"]
    assert rag_label("bogus") == RAG_LABELS["unknown"]


def test_format_percent_handles_none_and_strings():
    assert format_percent(None) == "—"
    assert format_percent("not-a-number") == "—"
    assert format_percent(82.5) == "82.5%"
    assert format_percent(82.5, decimals=0) == "82%"


def test_format_currency_formats_decimal_thousands():
    assert format_currency(None) == "—"
    assert format_currency(1234567.89) == "USD 1,234,567.89"
    assert format_currency(10, currency="UGX", decimals=0) == "UGX 10"


def test_format_date_accepts_date_and_datetime_and_none():
    assert format_date(None) == "—"
    assert format_date(date(2026, 4, 24)) == "24 Apr 2026"
    assert format_date(datetime(2026, 4, 24, 13, 30)) == "24 Apr 2026"


def test_truncate_elides_long_strings_and_preserves_short():
    assert truncate(None) == ""
    assert truncate("short") == "short"
    long = "x" * 100
    out = truncate(long, length=10)
    assert out.endswith("…")
    assert len(out) == 10
