from pathlib import Path

from autoshorts.imported_clip_assembler import build_imported_clip_assembly_plan, discover_imported_ai_clips


VIDEO_ID = "hidden-money-systems-warum-ein-billiges-auto-teuer-sein-kann"


def _production_jobs() -> dict:
    return {
        "schema_version": "free_production_jobs.v1",
        "video": {"id": VIDEO_ID, "title": "Warum ein billiges Auto teuer sein kann", "duration_ms": 34000},
        "jobs": [
            {
                "scene_id": "scene_01",
                "asset_mode": "cinematic_ai_video",
                "provider": "local_renderer",
                "execution_mode": "procedural_motion",
                "duration_seconds": 1.4,
                "overlay_text": "Dieser Occasion-Käufer denkt, er spart 4'000 Franken.",
            },
            {
                "scene_id": "scene_02",
                "asset_mode": "cinematic_ai_video",
                "provider": "local_renderer",
                "execution_mode": "procedural_motion",
                "duration_seconds": 3.6,
                "overlay_text": "Das sieht harmlos aus.",
            },
            {
                "scene_id": "scene_03",
                "asset_mode": "mechanism_animation",
                "provider": "local_renderer",
                "execution_mode": "mechanism_reveal_animation",
                "duration_seconds": 13,
                "overlay_text": "Röntgenblick durch Preis...",
            },
        ],
    }


def test_discover_imported_ai_clips_finds_only_scene_named_video_files(tmp_path):
    clip_dir = tmp_path / VIDEO_ID
    clip_dir.mkdir(parents=True)
    (clip_dir / "scene_01.mp4").write_bytes(b"fake")
    (clip_dir / "scene_02.mov").write_bytes(b"fake")
    (clip_dir / "notes.txt").write_text("ignore", encoding="utf-8")

    clips = discover_imported_ai_clips(VIDEO_ID, tmp_path)

    assert set(clips) == {"scene_01", "scene_02"}
    assert clips["scene_01"] == clip_dir / "scene_01.mp4"
    assert clips["scene_02"] == clip_dir / "scene_02.mov"


def test_build_imported_clip_assembly_plan_prefers_imported_realistic_clips_and_local_fallbacks(tmp_path):
    clip_dir = tmp_path / VIDEO_ID
    clip_dir.mkdir(parents=True)
    (clip_dir / "scene_01.mp4").write_bytes(b"fake")

    plan = build_imported_clip_assembly_plan(_production_jobs(), imported_root=tmp_path)

    assert plan["schema_version"] == "imported_clip_assembly.v1"
    assert plan["video"]["id"] == VIDEO_ID
    assert plan["budget_policy"]["paid_video_credits_allowed"] is False
    assert plan["final_assembly"] == "local_ffmpeg"

    scene_01 = plan["scenes"][0]
    scene_02 = plan["scenes"][1]
    scene_03 = plan["scenes"][2]

    assert scene_01["source"] == "imported_ai_clip"
    assert scene_01["clip_path"] == str(clip_dir / "scene_01.mp4")
    assert scene_01["captions_added_locally"] is True

    assert scene_02["source"] == "local_renderer_fallback"
    assert scene_02["missing_expected_clip"] == str(clip_dir / "scene_02.mp4")

    assert scene_03["source"] == "local_renderer"
    assert scene_03["role"] == "mechanism_or_caption_layer"


def test_chatgpt_pro_video_generation_is_marked_unavailable_in_assembly_notes(tmp_path):
    plan = build_imported_clip_assembly_plan(_production_jobs(), imported_root=tmp_path)

    openai_note = next(note for note in plan["provider_notes"] if note["provider"] == "chatgpt_pro_sora")

    assert openai_note["available_for_new_video_generation"] is False
    assert "Sora web and app experiences were discontinued on April 26, 2026" in openai_note["evidence"]
    assert openai_note["decision"] == "do_not_use_for_new_video_generation"
