"""Boundary tests for _derive_episode_id — Law 11."""
from pathlib import Path

import pytest

from recoil.api.adapters.beats import _derive_episode_id, _require_episode_id
from recoil.api.schemas.engine import MissingCanonicalFieldError


def test_returns_episode_id_field_when_present():
    shot = {"episode_id": "ep_002"}
    assert _derive_episode_id(shot, Path("anything.mp4"), "test") == "ep_002"


def test_parses_episode_from_output_path_driver_beware_form():
    shot = {"output_path": "projects/driver-beware/output/video/ep_001/shot_foo.mp4"}
    assert _derive_episode_id(shot, Path("shot_foo.mp4"), "driver-beware") == "ep_001"


def test_parses_microdrama_underscore_sh_form():
    shot = {}
    assert _derive_episode_id(shot, Path("EP002_SH010_take1.mp4"), "tartarus") == "EP002"


def test_returns_none_for_ref_files():
    shot = {}
    assert _derive_episode_id(shot, Path("REF_hero_clean.png"), "any") is None


def test_unresolvable_filename_returns_none():
    # Build A Phase 4 retired the filename-prefix fallback: an unresolvable
    # filename now yields None (no event emitted), so the caller can skip
    # (synthesis) or raise (route boundary).
    shot = {}
    assert _derive_episode_id(shot, Path("CRASH_random_thing.mp4"), "test") is None


def test_require_episode_id_raises_for_unresolvable_filename():
    shot = {}
    with pytest.raises(MissingCanonicalFieldError):
        _require_episode_id(shot, Path("CRASH_random_thing.mp4"), "test")
