from coverage_events import coverage_events


def _feed(frames):
    return {
        "meta": {"presentationLagS": 22},
        "teams": [{"name": "Bahamas", "boats": [{"deviceId": "boat", "sailId": "6"}]}],
        "frames": frames,
    }


def test_normal_tracking_jitter_is_silent():
    frames = {str(sec): {"boat": {"timestampUtcMs": (sec // 3) * 3000}}
              for sec in range(31)}
    assert coverage_events(_feed(frames)) == []


def test_a_long_outage_is_announced_once_and_recovery_once():
    frames = {}
    for sec in range(41):
        source = 0 if sec < 30 else 30_000
        frames[str(sec)] = {"boat": {"timestampUtcMs": source}}
    events = coverage_events(_feed(frames))

    assert [(e["tSec"], e["type"]) for e in events] == [(3, "coverage"), (30, "coverage")]
    assert "Bahamas 6 is not visible" in events[0]["text"]
    assert "visible to our coverage again" in events[1]["text"]


def test_multiple_missing_boats_share_one_viewer_call():
    feed = _feed({str(sec): {} for sec in range(31)})
    feed["teams"][0]["boats"].append({"deviceId": "boat-2", "sailId": "7"})
    events = coverage_events(feed)

    assert len(events) == 1
    assert "Bahamas 6 and Bahamas 7 are not visible" in events[0]["text"]
