"""Tests for recoil/workspace/verdict_helpers.py."""

import sys
from pathlib import Path

import pytest


_RECOIL_ROOT = Path(__file__).resolve().parent.parent.parent
if str(_RECOIL_ROOT) not in sys.path:
    sys.path.insert(0, str(_RECOIL_ROOT))


@pytest.fixture
def tmp_projects_root(tmp_path, monkeypatch):
    from recoil.core import paths

    # core.project does not export projects_root() (Phase 4.4 special case);
    # project.py reads via projects_root() which honors RECOIL_PROJECTS_ROOT.
    monkeypatch.setenv("RECOIL_PROJECTS_ROOT", str(tmp_path))
    return tmp_path


@pytest.fixture
def microdrama_project(tmp_projects_root):
    from recoil.core.project import Project

    proj = tmp_projects_root / "tartarus"
    proj.mkdir()
    (proj / "project_config.json").write_text('{"mode": "microdrama"}')
    return Project("tartarus")


@pytest.fixture
def client_project(tmp_projects_root):
    from recoil.core.project import Project

    proj = tmp_projects_root / "driver-beware"
    proj.mkdir()
    (proj / "project_config.json").write_text('{"mode": "client_deliverable"}')
    return Project("driver-beware")


# ── derive_shot_identity ────────────────────────────────────────


class TestDeriveShotIdentityMicrodrama:
    def test_take_suffix_extracted(self, microdrama_project):
        from recoil.workspace.verdict_helpers import derive_shot_identity

        assert derive_shot_identity("shot_033_take2.mp4", microdrama_project) == (
            "shot_033",
            2,
        )

    def test_no_take_defaults_to_one(self, microdrama_project):
        from recoil.workspace.verdict_helpers import derive_shot_identity

        assert derive_shot_identity("shot_033.mp4", microdrama_project) == (
            "shot_033",
            1,
        )

    def test_double_digit_take(self, microdrama_project):
        from recoil.workspace.verdict_helpers import derive_shot_identity

        assert derive_shot_identity("shot_005_take11.mp4", microdrama_project) == (
            "shot_005",
            11,
        )


class TestDeriveShotIdentityClient:
    def test_stem_is_identity(self, client_project):
        from recoil.workspace.verdict_helpers import derive_shot_identity

        sid, take = derive_shot_identity("V1_STAY_IN_CAR_SH01.mp4", client_project)
        assert sid == "V1_STAY_IN_CAR_SH01"
        assert take is None

    def test_take_suffix_is_part_of_name(self, client_project):
        """Client mode: _take1 in the filename is NOT stripped."""
        from recoil.workspace.verdict_helpers import derive_shot_identity

        sid, take = derive_shot_identity("REGEN_P02_take1.mp4", client_project)
        assert sid == "REGEN_P02_take1"
        assert take is None

    def test_version_suffix_distinct(self, client_project):
        from recoil.workspace.verdict_helpers import derive_shot_identity

        sid_v1, _ = derive_shot_identity("V1_STAY.mp4", client_project)
        sid_v2, _ = derive_shot_identity("V1_STAY_v2.mp4", client_project)
        sid_v3, _ = derive_shot_identity("V1_STAY_v3.mp4", client_project)
        assert sid_v1 == "V1_STAY"
        assert sid_v2 == "V1_STAY_v2"
        assert sid_v3 == "V1_STAY_v3"


# ── verdict_filename ────────────────────────────────────────────


class TestVerdictFilename:
    def test_microdrama_with_take(self):
        from recoil.workspace.verdict_helpers import verdict_filename

        assert verdict_filename("shot_033", 2) == "shot_033_take2_verdict.json"

    def test_microdrama_take_one(self):
        from recoil.workspace.verdict_helpers import verdict_filename

        assert verdict_filename("shot_033", 1) == "shot_033_take1_verdict.json"

    def test_client_no_take(self):
        from recoil.workspace.verdict_helpers import verdict_filename

        assert (
            verdict_filename("V1_STAY_IN_CAR_SH01", None)
            == "V1_STAY_IN_CAR_SH01_verdict.json"
        )


# ── verdicts_dir ────────────────────────────────────────────────


class TestVerdictsDir:
    def test_creates_directory(self, tmp_path):
        from recoil.workspace.verdict_helpers import verdicts_dir

        ep_dir = tmp_path / "ep_001"
        ep_dir.mkdir()
        d = verdicts_dir(ep_dir)
        assert d == ep_dir / ".verdicts"
        assert d.is_dir()

    def test_idempotent(self, tmp_path):
        from recoil.workspace.verdict_helpers import verdicts_dir

        ep_dir = tmp_path / "ep_001"
        ep_dir.mkdir()
        d1 = verdicts_dir(ep_dir)
        d2 = verdicts_dir(ep_dir)
        assert d1 == d2
        assert d1.is_dir()

    def test_dot_prefix_hides_from_finder(self, tmp_path):
        """Sanity: the dir starts with `.` so macOS Finder hides it."""
        from recoil.workspace.verdict_helpers import verdicts_dir

        ep_dir = tmp_path / "ep_001"
        ep_dir.mkdir()
        d = verdicts_dir(ep_dir)
        assert d.name.startswith(".")
