"""CP-7 Phase 2 — Take construction tests."""

import sys
import pathlib

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()

import pytest  # noqa: E402

from recoil.pipeline.core.take import Take  # noqa: E402
from recoil.pipeline.core.workflow import Workflow, WorkflowStep  # noqa: E402


def _wf(workflow_id="wf1") -> Workflow:
    return Workflow(workflow_id=workflow_id, steps=[
        WorkflowStep(step_id="kf", modality="image_t2i",
                     payload={"shot_id": "X", "prompt": "p", "model": "nbp"}),
    ])


def test_take_minimal():
    t = Take(take_id="t0", take_index=0, workflow=_wf())
    assert t.take_id == "t0" and t.take_index == 0 and t.status == "pending"
    assert t.workflow.workflow_id == "wf1" and t.take_metadata == {} and t.created_at


def test_take_with_metadata():
    t = Take(take_id="t0", take_index=0, workflow=_wf(),
             take_metadata={"model": "kling-o3", "operator": "cp7_test"})
    assert t.take_metadata["model"] == "kling-o3"


def test_take_rejects_empty_take_id():
    with pytest.raises(ValueError):
        Take(take_id="", take_index=0, workflow=_wf())


def test_take_rejects_negative_or_non_int_index():
    with pytest.raises(ValueError):
        Take(take_id="t0", take_index=-1, workflow=_wf())
    with pytest.raises(ValueError):
        Take(take_id="t0", take_index="zero", workflow=_wf())  # type: ignore


def test_take_rejects_non_workflow():
    with pytest.raises(TypeError):
        Take(take_id="t0", take_index=0, workflow={"workflow_id": "wf1"})  # type: ignore


def test_take_rejects_non_dict_metadata():
    with pytest.raises(TypeError):
        Take(take_id="t0", take_index=0, workflow=_wf(),
             take_metadata="not a dict")  # type: ignore
