from autoshorts.rendering.final_overlay_policy import (
    FinalOverlayPolicy,
    OverlayElement,
    OverlayKind,
    evaluate_final_overlay_policy,
)
from autoshorts.rendering.visual_first_shot_plan import build_visual_first_shot_plan


def test_final_overlay_policy_allows_captions_and_one_small_label_per_scene():
    policy = FinalOverlayPolicy.default()
    elements = [
        OverlayElement(kind=OverlayKind.CAPTION, scene_id="s01", screen_area_ratio=0.18),
        OverlayElement(kind=OverlayKind.LABEL, scene_id="s01", screen_area_ratio=0.03),
    ]

    result = evaluate_final_overlay_policy(elements, policy=policy)

    assert result.allowed is True


def test_final_overlay_policy_blocks_preview_cards_and_debug_frames():
    policy = FinalOverlayPolicy.default()
    elements = [
        OverlayElement(kind=OverlayKind.PREVIEW_FRAME, scene_id="s01", screen_area_ratio=0.6),
        OverlayElement(kind=OverlayKind.DEBUG_BAR, scene_id="s01", screen_area_ratio=0.05),
    ]

    result = evaluate_final_overlay_policy(elements, policy=policy)

    assert result.allowed is False
    assert result.reason == "overlay_overload"


def test_final_overlay_policy_blocks_large_textbox_over_35_percent():
    result = evaluate_final_overlay_policy(
        [OverlayElement(kind=OverlayKind.TEXTBOX, scene_id="s02", screen_area_ratio=0.36)]
    )

    assert result.allowed is False
    assert "large textbox" in "; ".join(result.violations)


def test_final_overlay_policy_blocks_more_than_one_label_per_scene():
    elements = [
        OverlayElement(kind=OverlayKind.LABEL, scene_id="s03", screen_area_ratio=0.02),
        OverlayElement(kind=OverlayKind.LABEL, scene_id="s03", screen_area_ratio=0.02),
    ]

    result = evaluate_final_overlay_policy(elements)

    assert result.allowed is False
    assert "too many labels" in "; ".join(result.violations)


def test_visual_first_shot_plan_uses_wan_as_main_visual_layer():
    plan = build_visual_first_shot_plan("ai-output-autopsy-decision-summary-38s")

    assert len(plan.scenes) == 5
    assert all(scene.wan_visual_primary is True for scene in plan.scenes)
    assert all("card" not in scene.visual_prompt.lower() for scene in plan.scenes)
    assert plan.scenes[2].scene_id == "s03_mechanism"
    assert "compression funnel" in plan.scenes[2].visual_prompt.lower()
    assert plan.scenes[0].max_overlay_labels <= 1
