import json
from pathlib import Path


def test_every_obs_boat_camera_uses_hls():
    """OBS must never fall back to whole-file MP4 switching; HLS owns the playout buffer."""
    root = Path(__file__).resolve().parents[2] / "live" / "obs"
    for name in ("stream_1080.json", "video_wall.json"):
        document = json.loads((root / name).read_text(encoding="utf-8"))
        urls = [item.get("settings", {}).get("url", "")
                for scene in document["scenes"] for item in scene["items"]]
        cameras = [url for url in urls if "boatcam" in url]
        assert cameras, name
        assert all("hls=1" in url and "readBase=" in url for url in cameras), (name, cameras)


def test_hls_instance_follows_the_feed_header():
    """A static OBS URL must follow heat changes without storing an instance id or reloading."""
    page = (Path(__file__).resolve().parents[1] / "web" / "boatcam.html").read_text(encoding="utf-8")
    assert "feed?.data?.meta?.instanceId" in page
    assert "instance !== _hlsInstance" in page
    assert "_hlsInstance = hlsInstance(feed)" in page


def test_private_camera_playlists_use_the_feed_origin_proxy():
    """The private-read capability remains server-side; JavaScript receives only a capability bit."""
    page = (Path(__file__).resolve().parents[1] / "web" / "boatcam.html").read_text(encoding="utf-8")
    assert "feed?.meta?.cameraPlaylistProxy ? ''" in page
    assert "X-VR-Producer-Token" not in page


def test_hls_camera_sync_is_monotonic():
    """The live camera may catch up, but it must never replay an already transmitted instant."""
    page = (Path(__file__).resolve().parents[1] / "web" / "boatcam.html").read_text(encoding="utf-8")
    assert "cameraHlsSyncDecision" in page
    assert "Math.abs(drift) > 6" not in page
    assert "video.currentTime + drift" not in page
