import json
from pathlib import Path

from autoshorts.free_production_jobs import build_free_production_jobs, write_free_production_jobs


def _asset_plan() -> dict:
    path = Path("data/asset_plans/mechanism_pilots/hidden-money-systems-warum-ein-billiges-auto-teuer-sein-kann.json")
    return json.loads(path.read_text(encoding="utf-8"))


def test_free_production_jobs_never_use_paid_video_credit_providers():
    jobs = build_free_production_jobs(_asset_plan())

    assert jobs["schema_version"] == "free_production_jobs.v1"
    assert jobs["budget_policy"]["paid_video_credits_allowed"] is False
    forbidden = {"kling", "hailuo", "runway", "veo", "pika", "luma"}
    providers = {job["provider"] for job in jobs["jobs"]}
    assert providers.isdisjoint(forbidden)
    assert {job["provider"] for job in jobs["jobs"]} <= {
        "local_renderer",
        "local_ffmpeg",
        "free_nvidia_llm",
    }


def test_free_production_jobs_map_cinematic_scenes_to_local_motion_design():
    jobs = build_free_production_jobs(_asset_plan())

    first = jobs["jobs"][0]

    assert first["asset_mode"] == "cinematic_ai_video"
    assert first["provider"] == "local_renderer"
    assert first["execution_mode"] == "procedural_motion"
    assert "Ken Burns" in first["free_workflow"] or "parallax" in first["free_workflow"]
    assert first["requires_api_key"] is False
    assert first["cost"] == "free"


def test_free_production_jobs_use_nvidia_llm_only_for_optional_prompt_refinement():
    jobs = build_free_production_jobs(_asset_plan())

    llm_jobs = [job for job in jobs["jobs"] if job["provider"] == "free_nvidia_llm"]

    assert llm_jobs
    assert all(job["requires_api_key"] == "NVIDIA_API_KEY" for job in llm_jobs)
    assert all(job["side_effect"] == "text_refinement_only" for job in llm_jobs)
    assert all("video generation" not in job["free_workflow"].lower() for job in llm_jobs)


def test_mechanism_free_production_jobs_preserve_total_video_duration():
    jobs = build_free_production_jobs(_asset_plan())
    local_jobs = [job for job in jobs["jobs"] if job["provider"] in {"local_renderer", "local_ffmpeg"}]

    assert sum(job["duration_seconds"] for job in local_jobs) == jobs["video"]["duration_ms"] / 1000


def test_write_free_production_jobs_outputs_json(tmp_path):
    paths = write_free_production_jobs([_asset_plan()], tmp_path)

    assert len(paths) == 1
    payload = json.loads(paths[0].read_text(encoding="utf-8"))
    assert payload["schema_version"] == "free_production_jobs.v1"
    assert payload["video"]["id"] == "hidden-money-systems-warum-ein-billiges-auto-teuer-sein-kann"
