from inspect import signature
from pathlib import Path

import pytest

from recoil.tools import script_doctor


@pytest.fixture
def script_doctor_project(tmp_path, monkeypatch):
    monkeypatch.setenv("RECOIL_PROJECTS_ROOT", str(tmp_path))
    (tmp_path / ".recoil-data-root").touch()

    project_root = tmp_path / "tartarus"
    episodes_dir = project_root / "scripting" / "episodes"
    bible_dir = project_root / "scripting" / "bible"
    episodes_dir.mkdir(parents=True)
    bible_dir.mkdir(parents=True)

    (episodes_dir / "ep_001.md").write_text("Episode fixture content.\n", encoding="utf-8")
    (bible_dir / "characters.md").write_text("Character fixture content.\n", encoding="utf-8")
    (project_root / "scripting" / "treatment.md").write_text(
        "Treatment fixture content.\n",
        encoding="utf-8",
    )

    return {
        "data_root": tmp_path,
        "project_root": project_root,
    }


def _bundle_corpus(project: str, source_root: Path) -> dict:
    params = signature(script_doctor.bundle_corpus).parameters
    if "root" in params or len(params) > 1:
        return script_doctor.bundle_corpus(project, source_root)
    return script_doctor.bundle_corpus(project)


def test_bundle_corpus_reads_data_root(script_doctor_project):
    corpus = _bundle_corpus("tartarus", Path("/nonexistent-source-root"))

    assert corpus["episodes"] == {1: "Episode fixture content.\n"}
    assert corpus["characters"] == "Character fixture content.\n"
    assert corpus["treatment"] == "Treatment fixture content.\n"


def test_state_writes_under_data_root(script_doctor_project):
    out_path = script_doctor.save_brief(
        {"stats": {}, "findings": []},
        "tartarus",
        pass_type="diagnostic",
    )

    expected_path = (
        script_doctor_project["data_root"]
        / "tartarus"
        / "_pipeline"
        / "state"
        / "script_doctor_brief.json"
    )
    source_relative_path = (
        Path.cwd() / "tartarus" / "_pipeline" / "state" / "script_doctor_brief.json"
    )

    assert out_path == expected_path
    assert out_path.exists()
    assert out_path != source_relative_path


def test_missing_project_fails_loud(script_doctor_project, capsys):
    with pytest.raises(SystemExit) as exc:
        script_doctor.bundle_corpus("unknown-project")

    assert exc.value.code == 1
    assert "ERROR:" in capsys.readouterr().err
