from recoil.pipeline.core.persistence import SceneLockedError
from recoil.pipeline.core.take import Scene


def test_scene_lock_fields_round_trip() -> None:
    scene = Scene(
        scene_id="BATCH_004",
        locked=True,
        lock_reason="staged",
        locked_by="JT",
        locked_at="2026-06-13T00:00:00Z",
    )

    restored = Scene.from_dict(scene.to_dict())

    assert restored.locked is True
    assert restored.lock_reason == "staged"
    assert restored.locked_by == "JT"
    assert restored.locked_at == "2026-06-13T00:00:00Z"


def test_scene_from_dict_defaults_absent_lock_fields_to_unlocked() -> None:
    scene = Scene.from_dict(
        {
            "scene_id": "BATCH_004",
            "beats": [],
            "scene_metadata": {},
            "created_at": "2026-06-13T00:00:00Z",
        }
    )

    assert scene.locked is False
    assert scene.lock_reason is None
    assert scene.locked_by is None
    assert scene.locked_at is None


def test_scene_locked_error_carries_batch_id_and_reason() -> None:
    err = SceneLockedError("BATCH_004", "staged")

    assert err.batch_id == "BATCH_004"
    assert err.lock_reason == "staged"
    assert "BATCH_004" in str(err)
    assert "staged" in str(err)
