"""CP-6 Phase 2 — Workflow / WorkflowStep JSON round-trip tests."""

import sys
import pathlib
import json

sys.path.insert(0, str(pathlib.Path(__file__).resolve().parent.parent.parent.parent))
from recoil.core.paths import ensure_pipeline_importable  # noqa: E402
ensure_pipeline_importable()


from recoil.pipeline.core.receipts import GenerationReceipt  # noqa: E402
from recoil.pipeline.core.registry import RunResult  # noqa: E402
from recoil.pipeline.core.workflow import Workflow, WorkflowStep  # noqa: E402


def _sample_receipt(modality="image_t2i", shot_id="X", success=True) -> GenerationReceipt:
    rr = RunResult(
        id=f"{shot_id}_{modality}_1700000000",
        modality=modality,
        output_path="/tmp/x.png" if success else None,
        output_url=None,
        metadata={
            "cost_usd": 0.04, "final_state": "keyframe_generated",
            "model": "nbp", "pipeline": "still",
            "gate_verdict": None, "take_index": 0,
        },
        success=success,
        error=None if success else "boom",
    )
    return GenerationReceipt(
        receipt_id=f"rcpt_1_{shot_id}_{modality}",
        modality=modality,
        caller_id="test",
        project="tartarus",
        episode=1,
        shot_id=shot_id,
        timestamp_utc="2026-04-27T03:14:15Z",
        run_result=rr,
        provenance={"dispatch_path": "test", "model": "nbp"},
        eval_scores={},
    )


def test_workflow_step_round_trip_no_receipt():
    s = WorkflowStep(
        step_id="kf", modality="image_t2i",
        payload={"shot_id": "X", "prompt": "p", "model": "nbp"},
        depends_on=["upstream"],
    )
    s2 = WorkflowStep.from_dict(s.to_dict())
    assert s == s2


def test_workflow_step_round_trip_with_receipt():
    s = WorkflowStep(
        step_id="kf", modality="image_t2i",
        payload={"shot_id": "X", "prompt": "p", "model": "nbp"},
        depends_on=[],
        status="succeeded",
        receipt=_sample_receipt(),
        started_us=1700000000_000_000,
        finished_us=1700000000_500_000,
    )
    s2 = WorkflowStep.from_dict(s.to_dict())
    assert s2.status == "succeeded"
    assert s2.receipt is not None
    assert s2.receipt.run_result.success is True
    assert s2.started_us == s.started_us
    assert s2.finished_us == s.finished_us
    # Round-trip equality via dataclass __eq__
    assert s == s2


def test_workflow_step_round_trip_with_failed_receipt():
    s = WorkflowStep(
        step_id="kf", modality="image_t2i",
        payload={"shot_id": "X", "prompt": "p", "model": "nbp"},
        status="failed",
        receipt=_sample_receipt(success=False),
        error=None,
    )
    s2 = WorkflowStep.from_dict(s.to_dict())
    assert s2.status == "failed"
    assert s2.receipt.run_result.success is False
    assert s2.receipt.run_result.error == "boom"
    assert s == s2


def test_workflow_round_trip_minimal():
    wf = Workflow(workflow_id="wf1", steps=[
        WorkflowStep(step_id="kf", modality="image_t2i",
                     payload={"shot_id": "X", "prompt": "p", "model": "nbp"}),
    ])
    wf2 = Workflow.from_dict(wf.to_dict())
    assert wf == wf2


def test_workflow_round_trip_multi_step_with_receipts():
    wf = Workflow(
        workflow_id="wf1",
        steps=[
            WorkflowStep(
                step_id="kf", modality="image_t2i",
                payload={"shot_id": "X", "prompt": "p", "model": "nbp"},
                status="succeeded",
                receipt=_sample_receipt(modality="image_t2i"),
            ),
            WorkflowStep(
                step_id="vid", modality="video_i2v",
                payload={"shot_id": "X", "prompt": "p", "model": "seeddance-2.0"},
                depends_on=["kf"],
                status="succeeded",
                receipt=_sample_receipt(modality="video_i2v"),
            ),
        ],
        global_provenance={"project": "tartarus", "episode": 1},
        created_at="2026-04-27T03:14:15Z",
    )
    wf2 = Workflow.from_dict(wf.to_dict())
    assert wf == wf2


def test_workflow_to_dict_is_json_serializable():
    wf = Workflow(
        workflow_id="wf1",
        steps=[
            WorkflowStep(
                step_id="kf", modality="image_t2i",
                payload={"shot_id": "X", "prompt": "p", "model": "nbp"},
                status="succeeded",
                receipt=_sample_receipt(),
            ),
        ],
        global_provenance={"project": "tartarus", "episode": 1, "tags": ["scene_3"]},
    )
    s = json.dumps(wf.to_dict())
    assert "tartarus" in s
    assert "kf" in s
    assert "image_t2i" in s


def test_workflow_round_trip_preserves_global_provenance():
    wf = Workflow(
        workflow_id="wf1", steps=[],
        global_provenance={"a": 1, "b": "two", "c": [1, 2, 3], "d": {"e": "f"}},
    )
    wf2 = Workflow.from_dict(wf.to_dict())
    assert wf2.global_provenance == wf.global_provenance


def test_workflow_round_trip_empty_steps():
    wf = Workflow(workflow_id="wf_empty", steps=[])
    wf2 = Workflow.from_dict(wf.to_dict())
    assert wf == wf2
