import pytest

from recoil.execution.execution_store import ExecutionStore
from recoil.execution.pass_store import PassStore
from recoil.workspace import helpers as workspace_helpers
from recoil.workspace.tests._board_test_helpers import _write_scene, _write_sidecar


@pytest.fixture
def board_route_project(tmp_path, monkeypatch):
    from recoil.workspace import server as ws_server

    projects_root = tmp_path / "projects"
    projects_root.mkdir()
    (projects_root / ".recoil-data-root").write_text("recoil-data-root\n")
    project = "fixture"
    project_root = projects_root / project
    project_root.mkdir()
    (project_root / "project_config.json").write_text("{}")
    monkeypatch.setenv("RECOIL_PROJECTS_ROOT", str(projects_root))
    workspace_helpers._stores.clear()
    ws_server._board_cache.clear()
    ws_server._board_cache_time.clear()
    ws_server._board_cache_mtime_key.clear()

    scenes_dir = project_root / "_pipeline" / "state" / "orchestration" / "scenes"
    storyboards_dir = project_root / "prep" / "ep_001" / "storyboards"
    scenes_dir.mkdir(parents=True)
    storyboards_dir.mkdir(parents=True)

    _write_scene(
        scenes_dir / "ep_001_BATCH_001.json",
        "BATCH_001",
        [
            {"segment_id": "EP001_SH01", "setting": "kitchen", "duration_s": 1.5},
            {"segment_id": "EP001_SH02", "setting": "kitchen", "duration_s": 2.0},
        ],
        board_artifact="prep/ep_001/storyboards/BATCH_001_v06.png",
        board_status="proposed",
    )
    _write_sidecar(storyboards_dir / "BATCH_001_v06.png.json", {"status": "proposed"})
    (storyboards_dir / "BATCH_001_v06.png").write_bytes(b"png")

    store = ExecutionStore(project)
    for shot_id in ("EP001_SH01", "EP001_SH02"):
        store.update_shot(shot_id, episode_id="EP001", status="previs_pending")
    store.close()

    passes = PassStore(project)
    passes.create_pass("EP001_PASS_001_SH01_02_TEST", ["EP001_SH01", "EP001_SH02"])
    passes.close()

    yield {
        "server": ws_server,
        "project": project,
        "sidecar": storyboards_dir / "BATCH_001_v06.png.json",
    }

    workspace_helpers._stores.clear()
    ws_server._board_cache.clear()
    ws_server._board_cache_time.clear()
    ws_server._board_cache_mtime_key.clear()


@pytest.fixture
def two_batch_board_route_project(tmp_path, monkeypatch):
    from recoil.workspace import server as ws_server

    projects_root = tmp_path / "projects"
    projects_root.mkdir()
    (projects_root / ".recoil-data-root").write_text("recoil-data-root\n")
    project = "fixture"
    project_root = projects_root / project
    project_root.mkdir()
    (project_root / "project_config.json").write_text("{}")
    monkeypatch.setenv("RECOIL_PROJECTS_ROOT", str(projects_root))
    workspace_helpers._stores.clear()
    ws_server._board_cache.clear()
    ws_server._board_cache_time.clear()
    ws_server._board_cache_mtime_key.clear()

    scenes_dir = project_root / "_pipeline" / "state" / "orchestration" / "scenes"
    storyboards_dir = project_root / "prep" / "ep_001" / "storyboards"
    scenes_dir.mkdir(parents=True)
    storyboards_dir.mkdir(parents=True)

    _write_scene(
        scenes_dir / "ep_001_BATCH_001.json",
        "BATCH_001",
        [
            {"segment_id": "EP001_SH01", "setting": "kitchen", "duration_s": 1.5},
            {"segment_id": "EP001_SH02", "setting": "kitchen", "duration_s": 2.0},
        ],
        board_artifact="prep/ep_001/storyboards/BATCH_001_v06.png",
        board_status="proposed",
    )
    _write_scene(
        scenes_dir / "ep_001_BATCH_002.json",
        "BATCH_002",
        [
            {"segment_id": "EP001_SH03", "setting": "hall", "duration_s": 3.0},
            {"segment_id": "EP001_SH04", "setting": "hall", "duration_s": 4.25},
        ],
        board_artifact="prep/ep_001/storyboards/BATCH_002_v01.png",
        board_status="proposed",
    )
    _write_sidecar(storyboards_dir / "BATCH_001_v06.png.json", {"status": "proposed"})
    _write_sidecar(storyboards_dir / "BATCH_002_v01.png.json", {"status": "proposed"})
    (storyboards_dir / "BATCH_001_v06.png").write_bytes(b"png")
    (storyboards_dir / "BATCH_002_v01.png").write_bytes(b"png")

    store = ExecutionStore(project)
    for shot_id in ("EP001_SH01", "EP001_SH02", "EP001_SH03", "EP001_SH04"):
        store.update_shot(shot_id, episode_id="EP001", status="previs_pending")
    store.close()

    passes = PassStore(project)
    passes.create_pass("EP001_PASS_001_SH01_02_TEST", ["EP001_SH01", "EP001_SH02"])
    passes.create_pass("EP001_PASS_002_SH03_04_TEST", ["EP001_SH03", "EP001_SH04"])
    passes.close()

    yield {
        "server": ws_server,
        "project": project,
        "sidecar": storyboards_dir / "BATCH_001_v06.png.json",
        "second_sidecar": storyboards_dir / "BATCH_002_v01.png.json",
        "storyboards_dir": storyboards_dir,
    }

    workspace_helpers._stores.clear()
    ws_server._board_cache.clear()
    ws_server._board_cache_time.clear()
    ws_server._board_cache_mtime_key.clear()
