"""Unit tests for the MEL semantic-pill resolver."""
from __future__ import annotations

import pytest
from django.template import Context, Template

from apps.mel.indicators.badge_maps import DEFAULT, MAPS, resolve


def _render(template_str: str, **ctx) -> str:
    return Template("{% load mel_ui %}" + template_str).render(Context(ctx))


# ── Map shape ──────────────────────────────────────────────────────────


def test_maps_cover_known_kinds():
    assert set(MAPS) == {
        "severity", "status", "rag", "peer_review", "tier",
        "channel_type", "level",
    }


def test_channel_type_map_includes_all_intake_kinds():
    assert {"report_review", "beneficiary", "industry", "alumni", "moodle"} <= set(MAPS["channel_type"])


def test_level_map_covers_logframe_hierarchy():
    assert {"impact", "outcome", "output", "activity", "input"} <= set(MAPS["level"])


def test_severity_map_has_full_ladder():
    assert {"critical", "high", "medium", "low"} <= set(MAPS["severity"])


def test_rag_map_includes_unknown():
    assert "unknown" in MAPS["rag"]


def test_tier_map_keyed_by_int():
    assert set(MAPS["tier"]) == {1, 2, 3}


# ── resolve() ──────────────────────────────────────────────────────────


def test_resolve_unknown_value_returns_default():
    assert resolve("severity", "nope") == DEFAULT


def test_resolve_unknown_kind_returns_default():
    assert resolve("not_a_kind", "critical") == DEFAULT


def test_resolve_none_value_returns_default():
    assert resolve("severity", None) == DEFAULT


def test_resolve_normalises_case():
    cls, strong, label = resolve("severity", "Critical")
    assert cls == "badge-rose"
    assert strong is True
    assert label == "Critical"


def test_resolve_tier_accepts_string_int():
    cls, strong, label = resolve("tier", "3")
    assert cls == "badge-rose"
    assert strong is True


def test_resolve_tier_unknown_returns_default():
    assert resolve("tier", "99") == DEFAULT


# ── mel_badge template tag ────────────────────────────────────────────


@pytest.mark.parametrize("value,expected_class", [
    ("critical", "badge-rose"),
    ("high", "badge-rose"),
    ("medium", "badge-amber"),
    ("low", "badge-neutral"),
])
def test_mel_badge_severity(value, expected_class):
    html = _render('{% mel_badge kind="severity" value=value %}', value=value)
    assert expected_class in html
    assert "<span" in html
    assert "badge " in html


def test_mel_badge_critical_uses_strong_modifier():
    html = _render('{% mel_badge kind="severity" value="critical" %}')
    assert "badge--strong" in html
    assert "badge-rose" in html


def test_mel_badge_high_is_not_strong():
    html = _render('{% mel_badge kind="severity" value="high" %}')
    assert "badge--strong" not in html


def test_mel_badge_label_override_wins():
    html = _render('{% mel_badge kind="severity" value="critical" label="🔥" %}')
    assert ">🔥<" in html
    # Mapping class still applies
    assert "badge-rose" in html


def test_mel_badge_rag_amber_renders_watch_label():
    html = _render('{% mel_badge kind="rag" value="amber" %}')
    assert ">Needs attention<" in html
    assert "badge-amber" in html


def test_mel_badge_status_published_renders_emerald():
    html = _render('{% mel_badge kind="status" value="published" %}')
    assert "badge-emerald" in html
    assert ">Published<" in html


def test_mel_badge_status_unknown_falls_through_to_neutral():
    html = _render('{% mel_badge kind="status" value="banana" %}')
    assert "badge-neutral" in html


def test_mel_badge_tier_3_is_strong_rose():
    html = _render('{% mel_badge kind="tier" value=3 %}', )
    assert "badge--strong" in html
    assert "badge-rose" in html


def test_mel_badge_peer_review_in_review_is_sky():
    html = _render('{% mel_badge kind="peer_review" value="in_review" %}')
    assert "badge-sky" in html
    assert ">In review<" in html
