"""CP-10 Beat/Scene derived status states."""
from recoil.pipeline.core.take import Beat, Scene
from recoil.pipeline.core.workflow import Workflow, WorkflowStep


def _wf(wid="wf"):
    return Workflow(
        workflow_id=wid,
        steps=[WorkflowStep(step_id="kf", modality="image_t2i",
                            payload={"p": 1})],
    )


def test_status_not_started():
    b = Beat(beat_id="B")
    assert b.status == "not_started"


def test_status_generating():
    b = Beat(beat_id="B")
    t = b.new_take(workflow=_wf())
    t.status = "running"
    assert b.status == "generating"


def test_status_pending():
    b = Beat(beat_id="B")
    t = b.new_take(workflow=_wf())
    t.status = "failed"
    assert b.status == "pending"


def test_status_review():
    b = Beat(beat_id="B")
    t = b.new_take(workflow=_wf())
    t.status = "succeeded"
    b.primary_take_id = t.take_id
    assert b.status == "review"


def test_status_approved():
    b = Beat(beat_id="B")
    t = b.new_take(workflow=_wf())
    t.status = "succeeded"
    b.primary_take_id = t.take_id
    b.approved = True
    assert b.status == "approved"


def test_status_exhausted():
    b = Beat(beat_id="B", max_takes=2)
    for _ in range(2):
        t = b.new_take(workflow=_wf(f"w{_}"))
        t.status = "failed"
    assert b.is_exhausted is True
    assert b.status == "exhausted"


def test_scene_status_final():
    s = Scene(scene_id="S")
    for i in range(2):
        b = Beat(beat_id=f"B{i}")
        t = b.new_take(workflow=_wf(f"w{i}"))
        t.status = "succeeded"
        b.primary_take_id = t.take_id
        b.approved = True
        s.add_beat(b)
    assert s.status == "final"


def test_scene_status_review():
    s = Scene(scene_id="S")
    b1 = Beat(beat_id="B1")
    t1 = b1.new_take(workflow=_wf("w1"))
    t1.status = "succeeded"
    b1.primary_take_id = t1.take_id
    b1.approved = True
    b2 = Beat(beat_id="B2")
    t2 = b2.new_take(workflow=_wf("w2"))
    t2.status = "succeeded"
    b2.primary_take_id = t2.take_id  # review, not approved
    s.add_beat(b1)
    s.add_beat(b2)
    assert s.status == "review"


def test_scene_status_in_progress():
    s = Scene(scene_id="S")
    b1 = Beat(beat_id="B1")
    t1 = b1.new_take(workflow=_wf("w1"))
    t1.status = "succeeded"
    b1.primary_take_id = t1.take_id
    b1.approved = True
    b2 = Beat(beat_id="B2")  # not_started
    s.add_beat(b1); s.add_beat(b2)
    assert s.status == "in_progress"


def test_round_trip_preserves_new_fields():
    b = Beat(beat_id="B", max_takes=5, approved=True)
    d = b.to_dict()
    b2 = Beat.from_dict(d)
    assert b2.max_takes == 5
    assert b2.approved is True


def test_legacy_dict_defaults():
    """Pre-CP-10 dicts deserialize cleanly with defaults."""
    legacy = {
        "beat_id": "B",
        "takes": [],
        "primary_take_id": None,
        "beat_metadata": {},
        "created_at": "2026-01-01T00:00:00Z",
    }
    b = Beat.from_dict(legacy)
    assert b.max_takes == 3
    assert b.approved is False
