from autoshorts.keyframe_prompt import build_i2v_prompt_plan, write_i2v_prompt_plans
from autoshorts.mechanism_pipeline import build_mechanism_shot_plan
from autoshorts.retention_studio import PILOT_IDEAS, build_mechanism_explainer


def _pilot_shot_plan():
    explainer = build_mechanism_explainer(PILOT_IDEAS[0])
    return build_mechanism_shot_plan(explainer)


def test_i2v_prompt_plan_targets_only_ai_video_scenes_for_wan22():
    prompt_plan = build_i2v_prompt_plan(_pilot_shot_plan())

    assert prompt_plan["schema_version"] == "i2v_prompt_plan.v1"
    assert prompt_plan["style_profile"] == "photorealistic_macro_investigation"
    assert prompt_plan["video"]["id"] == "hidden-money-systems-warum-ein-billiges-auto-teuer-sein-kann"
    assert [scene["scene_id"] for scene in prompt_plan["scenes"]] == ["scene_01", "scene_02"]
    assert all(scene["wan_preset"] == "wan22_i2v_quality_416x736" for scene in prompt_plan["scenes"])


def test_car_keyframe_prompt_uses_clear_visible_inspection_bay_without_ai_text():
    scene = build_i2v_prompt_plan(_pilot_shot_plan())["scenes"][0]

    keyframe_prompt = scene["keyframe_prompt"]
    negative_prompt = scene["negative_prompt"]

    assert "red used compact car" in keyframe_prompt
    assert "bright European vehicle inspection garage" in keyframe_prompt
    assert "front three-quarter view" in keyframe_prompt
    assert "clean empty license plate area" in keyframe_prompt
    assert "No text, no logos, no watermark" in keyframe_prompt
    assert "unreadable license plate" in negative_prompt
    assert "fake UI text" in negative_prompt


def test_i2v_motion_prompt_has_one_camera_move_and_preserves_identity():
    scene = build_i2v_prompt_plan(_pilot_shot_plan())["scenes"][0]

    motion_prompt = scene["i2v_motion_prompt"]

    assert "Camera slowly pushes in" in motion_prompt
    assert "Preserve the same car and garage" in motion_prompt
    assert "No text, no logo, no watermark" in motion_prompt
    assert "slowly pushes in" in scene["motion_directive"]
    assert scene["clip_requirements"]["subject_identifiable_first_half_second"] is True
    assert scene["clip_requirements"]["caption_safe_space"] == "upper third and lower third"


def test_problem_scene_keeps_same_car_context_not_generic_macro_prompt():
    scene = build_i2v_prompt_plan(_pilot_shot_plan())["scenes"][1]

    assert "red used compact car" in scene["keyframe_prompt"]
    assert "inspection garage" in scene["i2v_motion_prompt"]
    assert "surface layer" in scene["i2v_motion_prompt"]


def test_non_ai_mechanism_scenes_become_renderer_notes_not_wan_jobs():
    prompt_plan = build_i2v_prompt_plan(_pilot_shot_plan())

    renderer_notes = prompt_plan["renderer_only_scenes"]

    assert [scene["scene_id"] for scene in renderer_notes] == ["scene_03", "scene_04", "scene_05"]
    assert renderer_notes[0]["asset_type"] == "mechanism_animation"
    assert renderer_notes[-1]["asset_type"] == "kinetic_text_overlay"
    assert all("Wan2.2" not in scene["note"] for scene in renderer_notes)


def test_write_i2v_prompt_plans_outputs_json(tmp_path):
    paths = write_i2v_prompt_plans([_pilot_shot_plan()], tmp_path)

    assert len(paths) == 1
    assert paths[0].name == "hidden-money-systems-warum-ein-billiges-auto-teuer-sein-kann.json"
    text = paths[0].read_text(encoding="utf-8")
    assert "i2v_prompt_plan.v1" in text
    assert "wan22_i2v_quality_416x736" in text
