from pathlib import Path

from autoshorts.i2v_clip_jobs import (
    build_i2v_clip_jobs,
    build_native_wan22_i2v_workflow,
    write_i2v_clip_jobs,
)
from autoshorts.keyframe_prompt import build_i2v_prompt_plan
from autoshorts.mechanism_pipeline import build_mechanism_shot_plan
from autoshorts.retention_studio import PILOT_IDEAS, build_mechanism_explainer


def _prompt_plan():
    explainer = build_mechanism_explainer(PILOT_IDEAS[0])
    shot_plan = build_mechanism_shot_plan(explainer)
    return build_i2v_prompt_plan(shot_plan)


def test_build_i2v_clip_jobs_creates_seeded_scene_jobs_with_expected_paths(tmp_path):
    keyframe_root = tmp_path / "keyframes"
    output_root = tmp_path / "clips"
    jobs = build_i2v_clip_jobs(
        _prompt_plan(),
        keyframe_root=keyframe_root,
        output_root=output_root,
        seeds=[101, 202],
    )

    assert len(jobs) == 4
    first = jobs[0]
    assert first["job_id"] == "scene_01_seed_101"
    assert first["scene_id"] == "scene_01"
    assert first["seed"] == 101
    assert first["keyframe_path"] == str(keyframe_root / "hidden-money-systems-warum-ein-billiges-auto-teuer-sein-kann/scene_01.png")
    assert first["output_path"] == str(output_root / "hidden-money-systems-warum-ein-billiges-auto-teuer-sein-kann/scene_01/seed_101.mp4")
    assert first["status"] == "needs_keyframe"
    assert first["review"]["human_review_required"] is True


def test_native_wan22_workflow_uses_scaled_t5_uploaded_image_and_no_baked_text():
    job = build_i2v_clip_jobs(_prompt_plan(), Path("keyframes"), Path("clips"), seeds=[303])[0]

    workflow = build_native_wan22_i2v_workflow(job, uploaded_image_name="scene_01.png")

    assert workflow["1"]["class_type"] == "UNETLoader"
    assert workflow["1"]["inputs"]["unet_name"] == "wan2.2_ti2v_5B_fp16.safetensors"
    assert workflow["2"]["inputs"]["clip_name"] == "umt5_xxl_fp8_e4m3fn_scaled.safetensors"
    assert workflow["5"]["inputs"]["vae_name"] == "wan2.2_vae.safetensors"
    assert workflow["6"]["inputs"]["image"] == "scene_01.png"
    assert workflow["8"]["inputs"]["length"] == 61
    assert workflow["9"]["inputs"]["seed"] == 303
    assert "No text, no logo, no watermark" in workflow["3"]["inputs"]["text"]
    assert "fake UI text" in workflow["4"]["inputs"]["text"]
    assert workflow["12"]["inputs"]["filename_prefix"].endswith("scene_01_seed_303")


def test_write_i2v_clip_jobs_outputs_json_package(tmp_path):
    path = write_i2v_clip_jobs(
        _prompt_plan(),
        output_file=tmp_path / "jobs.json",
        keyframe_root=Path("data/keyframes"),
        generated_clip_root=Path("data/generated_clips"),
        seeds=[1, 2, 3],
    )

    text = path.read_text(encoding="utf-8")
    assert "i2v_clip_jobs.v1" in text
    assert "scene_01_seed_1" in text
    assert "scene_02_seed_3" in text
    assert "keyframe_to_wan22_i2v_to_deterministic_renderer" in text
