"""Phase-0 scaffold tests: formatter registry empty + dispatch correctness.

(a) With an empty registry, get_formatter returns None for real categories.
(b) A registered dummy formatter is called verbatim — multi-line output is
    returned as-is (no Mode-B single-line cap applied).
"""

import pytest

from meshai.notifications.formatters import FORMATTERS, get_formatter, register
from meshai.notifications.events import make_event
from meshai.notifications.renderers.composer import compose_mesh_message


# ── (a) empty registry returns None for known categories ──────────────────────

@pytest.mark.parametrize("category", [
    # earthquake_event removed: Phase-1 registers formatters.quake for it.
    # weather_warning/weather_statement removed: Phase-2 registers formatters.nws.
    # road_closure/work_zone/road_incident/traffic_congestion removed: Phase-2 registers formatters.incident.
    # wildfire_declared/wildfire_incident/wildfire_closed removed: Phase-3b registers formatters.fire.
    "wildfire_hotspot",  # FIRMS — still deferred (not migrated)
    "battery_critical",
])
def test_get_formatter_returns_none_while_registry_empty(category):
    """Un-migrated categories must still return None from get_formatter."""
    # Only categories not yet migrated to the formatter+gater architecture.
    assert category not in FORMATTERS, (
        f"Category {category!r} should not be in FORMATTERS yet (not migrated)"
    )
    assert get_formatter(category) is None


# ── (b) registered dummy formatter is dispatched verbatim ────────────────────

_SYNTHETIC_CATEGORY = "_test_scaffold_dummy_category_phase0"
_MULTILINE_OUTPUT = "Line one\nLine two\nLine three"


def _dummy_formatter(event, *, now: float, budget: int) -> str:
    """Returns a fixed multi-line string to prove verbatim passthrough."""
    return _MULTILINE_OUTPUT


def test_registered_formatter_returns_verbatim_multiline(monkeypatch):
    """Register a dummy for a synthetic category; compose_mesh_message must
    return the dummy's multi-line output verbatim — newlines preserved — not
    re-processed through Mode-B's single-line budget loop.

    Cutover gate: the formatter is only dispatched when the category appears in
    MESHAI_CUTOVER_CATEGORIES.  This test sets the var to verify the formatter
    IS invoked once cut over (the complementary not-cutover case is covered by
    test_cutover_gate.py).
    """
    from meshai.notifications.cutover import _clear_cache as _cutover_clear
    # Mark synthetic category as cut over for this test.
    monkeypatch.setenv("MESHAI_CUTOVER_CATEGORIES", _SYNTHETIC_CATEGORY)
    _cutover_clear()
    # Register the dummy (clean up afterwards to avoid cross-test pollution).
    register(_SYNTHETIC_CATEGORY, _dummy_formatter)
    try:
        event = make_event(
            source="test",
            category=_SYNTHETIC_CATEGORY,
            severity="routine",
            title="First line\nSecond line",  # multi-line title
        )
        result = compose_mesh_message(event)
        assert result == _MULTILINE_OUTPUT, (
            f"Expected verbatim multi-line output, got: {result!r}"
        )
        # Verify newlines are preserved (Mode-B would strip them).
        assert "\n" in result, "Newlines must survive the formatter dispatch path"
    finally:
        FORMATTERS.pop(_SYNTHETIC_CATEGORY, None)
        _cutover_clear()  # restore cache for subsequent tests
