# recoil/pipeline/tests/test_bible_resolver.py
"""Bible resolver priority cascade per spec D5:
pipeline_client → pipeline_global → narrative → engine_store
"""

import json

import pytest


@pytest.fixture
def project_with_client_bible(tmp_path):
    proj = tmp_path / "afterimage"
    state = proj / "_pipeline" / "state" / "visual"
    state.mkdir(parents=True)
    (state / "client_bible.json").write_text(
        json.dumps({"source": "client", "name": "JT-edited"})
    )
    (state / "global_bible.json").write_text(
        json.dumps({"source": "global", "name": "global"})
    )
    return proj


def test_resolver_returns_client_bible_when_present(
    project_with_client_bible, monkeypatch
):
    from recoil.pipeline._lib.bible_resolver import resolve_bible

    monkeypatch.setattr(
        "recoil.pipeline._lib.bible_resolver._project_root",
        lambda p: project_with_client_bible,
    )
    snapshot = resolve_bible("afterimage")
    assert snapshot.content["source"] == "client"
    assert snapshot.source == "pipeline_client"


def test_resolver_falls_back_to_global(tmp_path, monkeypatch):
    from recoil.pipeline._lib.bible_resolver import resolve_bible

    proj = tmp_path / "afterimage"
    state = proj / "_pipeline" / "state" / "visual"
    state.mkdir(parents=True)
    (state / "global_bible.json").write_text(json.dumps({"source": "global"}))
    monkeypatch.setattr(
        "recoil.pipeline._lib.bible_resolver._project_root", lambda p: proj
    )
    snapshot = resolve_bible("afterimage")
    assert snapshot.content["source"] == "global"
    assert snapshot.source == "pipeline_global"


def test_capture_for_run_freezes_snapshot(project_with_client_bible, monkeypatch):
    from recoil.pipeline._lib.bible_resolver import resolve_bible, capture_for_run

    monkeypatch.setattr(
        "recoil.pipeline._lib.bible_resolver._project_root",
        lambda p: project_with_client_bible,
    )

    snap = capture_for_run("run-001", "afterimage")
    # Mutate the source after capture
    (project_with_client_bible / "_pipeline" / "state" / "visual" / "client_bible.json").write_text(
        json.dumps({"source": "client", "name": "MUTATED"})
    )
    snap2 = resolve_bible("afterimage", run_id="run-001")
    assert snap2.content["name"] == "JT-edited"  # frozen, not the mutated value
