from autoshorts.audio.voiceover import build_truetrace_final_voiceover
from autoshorts.rendering.final_video_plan import (
    FinalVideoPlan,
    build_truetrace_weird_email_final_video_plan,
    validate_final_video_plan,
)


def test_build_truetrace_weird_email_final_video_plan_is_mobile_first_and_concrete():
    voiceover = build_truetrace_final_voiceover("truetrace-ai-automation-quiet-rot-38s")

    plan = build_truetrace_weird_email_final_video_plan(voiceover)

    assert isinstance(plan, FinalVideoPlan)
    assert plan.candidate_id == "truetrace-ai-automation-quiet-rot-38s"
    assert plan.width == 1080
    assert plan.height == 1920
    assert plan.fps == 30
    assert plan.duration_ms == 37000
    assert [scene.scene_id for scene in plan.scenes] == [
        "clean-demo",
        "weird-email",
        "wrong-routing",
        "three-way-split",
        "final-rule",
    ]
    assert plan.scenes[0].start_ms == 0
    assert plan.scenes[-1].end_ms == plan.duration_ms
    assert all(scene.renderer_owned_text for scene in plan.scenes)
    assert all(scene.ai_generated_text_allowed is False for scene in plan.scenes)
    assert any("weird email" in scene.renderer_text.casefold() for scene in plan.scenes)
    assert any("Go through" in scene.renderer_text for scene in plan.scenes)
    assert any("Review" in scene.renderer_text for scene in plan.scenes)
    assert any("Stop" in scene.renderer_text for scene in plan.scenes)


def test_validate_final_video_plan_rejects_timing_text_and_static_failures():
    voiceover = build_truetrace_final_voiceover("truetrace-ai-automation-quiet-rot-38s")
    plan = build_truetrace_weird_email_final_video_plan(voiceover)
    broken_scene = plan.scenes[1].__class__(
        scene_id="bad",
        start_ms=1000,
        end_ms=1000,
        voiceover_segment="",
        visual_mode="static_card",
        motion_instruction="",
        renderer_text="",
        asset_prompt="",
        renderer_owned_text=False,
        ai_generated_text_allowed=True,
    )
    broken = plan.__class__(
        candidate_id=plan.candidate_id,
        width=1080,
        height=1920,
        fps=30,
        duration_ms=plan.duration_ms,
        scenes=(broken_scene,),
        source_voiceover_text=voiceover.text,
    )

    validation = validate_final_video_plan(broken)

    assert validation.is_valid is False
    assert "first scene must start at 0ms" in validation.errors
    assert "scene 1 end_ms must be greater than start_ms" in validation.errors
    assert "scene 1 voiceover_segment is required" in validation.errors
    assert "scene 1 renderer_text is required" in validation.errors
    assert "scene 1 static_card visual mode is not allowed" in validation.errors
    assert "scene 1 renderer text must be owned by renderer" in validation.errors
    assert "scene 1 AI-generated text is not allowed" in validation.errors
