import json
from pathlib import Path

from autoshorts.free_ai_video_providers import (
    FREE_AI_VIDEO_PROVIDERS,
    build_free_ai_video_handoff,
    recommended_provider_order,
    write_free_ai_video_handoffs,
)


FIXTURE = Path("data/free_production_jobs/mechanism_pilots/hidden-money-systems-warum-ein-billiges-auto-teuer-sein-kann.json")


def _jobs() -> dict:
    return json.loads(FIXTURE.read_text(encoding="utf-8"))


def test_provider_registry_contains_real_free_tier_candidates_from_research():
    providers = FREE_AI_VIDEO_PROVIDERS

    assert {"pixverse", "pika", "capcut", "hailuo"} <= set(providers)
    assert providers["pika"]["free_tier"]["monthly_credits"] == 80
    assert providers["pika"]["free_tier"]["max_resolution"] == "480p"
    assert providers["pixverse"]["free_tier"]["daily_refresh_credits"] == 90
    assert providers["capcut"]["free_tier"]["hd_export_claimed"] is True
    assert all(provider["cost_policy"] == "free_tier_only_no_paid_topups" for provider in providers.values())
    assert all(provider["automation_mode"] == "manual_browser_handoff" for provider in providers.values())


def test_recommended_provider_order_prioritizes_free_realistic_ai_video_for_cinematic_scenes():
    order = recommended_provider_order("cinematic_ai_video")

    assert order[:2] == ["pixverse", "pika"]
    assert "capcut" in order
    assert "runway" not in order
    assert "luma" not in order


def test_free_ai_video_handoff_creates_manual_jobs_for_realistic_clip_scenes_only():
    handoff = build_free_ai_video_handoff(_jobs())

    assert handoff["schema_version"] == "free_ai_video_handoff.v1"
    assert handoff["budget_policy"]["paid_topups_allowed"] is False
    assert handoff["video"]["id"] == "hidden-money-systems-warum-ein-billiges-auto-teuer-sein-kann"
    assert handoff["hybrid_strategy"]["final_assembly"] == "local_ffmpeg"

    ai_jobs = handoff["ai_video_jobs"]
    assert [job["scene_id"] for job in ai_jobs] == ["scene_01", "scene_02"]
    assert all(job["status"] == "manual_generation_required" for job in ai_jobs)
    assert all(job["provider_order"][:2] == ["pixverse", "pika"] for job in ai_jobs)
    assert all(job["free_tier_guardrails"]["do_not_buy_credits"] is True for job in ai_jobs)
    assert all(job["duration_seconds"] <= 5 for job in ai_jobs)
    assert all("no readable text" in job["negative_prompt"].lower() for job in ai_jobs)
    assert all("local procedural" not in job["prompt"].lower() for job in ai_jobs)
    assert all("paid ai-video credits" not in job["prompt"].lower() for job in ai_jobs)

    local_jobs = handoff["local_jobs"]
    assert {job["asset_mode"] for job in local_jobs} == {"mechanism_animation", "kinetic_text_overlay"}


def test_write_free_ai_video_handoffs_outputs_reviewable_json(tmp_path):
    paths = write_free_ai_video_handoffs([_jobs()], tmp_path)

    assert len(paths) == 1
    payload = json.loads(paths[0].read_text(encoding="utf-8"))
    assert payload["schema_version"] == "free_ai_video_handoff.v1"
    assert payload["ai_video_jobs"][0]["manual_steps"]
