"""W21B-wave-2.1: background_prompt v10 screen-content guard."""
from __future__ import annotations

from app.modules.pipeline.background_prompt import (
    PROMPT_VERSION_MAP,
    build_bg_user_prompt,
    resolve_prompt_version,
)
from app.modules.prompt_loader import load_prompt, load_schema


_V10_PACK_NAME = "10.202605290451"


def _bg_spec(surface_role: str = "interior_room"):
    return {
        "bg_id": "L05B07",
        "loc_id": "L05",
        "sub_location": "rooftop room interior",
        "state_label_raw": "day interior plate with TV fixture",
        "surface_role": surface_role,
        "applies_to_shots": ["S5_Shot7"],
    }


_OVERLAY = {
    "bg_id": "L05B07",
    "fp_id": "fp_l05_main",
    "use_numbered_elements": [1, 2],
    "ignore_numbered_elements": [3],
    "base_markers_to_reference": [
        {
            "number": 1,
            "label": "TV cabinet",
            "category": "fixture",
            "position_hint": "center wall",
            "base_layer_decision": "base_structural_unit",
        },
        {
            "number": 2,
            "label": "kitchen sink",
            "category": "fixture",
            "position_hint": "right wall",
            "base_layer_decision": "base_structural_unit",
        },
    ],
    "transient_markers_to_describe": [
        {
            "number": 3,
            "label": "news anchor face and subtitle ticker",
            "category": "screen_content",
            "position_hint": "inside TV screen",
            "base_layer_decision": "state_overlay_plot_cue",
        }
    ],
    "ignored_state_overlay_markers": [],
    "target_unit_marker_numbers": [1, 2],
    "dominant_target_unit_marker_number": 1,
    "clean_background_expected": False,
    "diagnostics": [],
}


def test_v10_selector_resolves_pack_name():
    assert PROMPT_VERSION_MAP["10"] == _V10_PACK_NAME
    assert resolve_prompt_version("10") == _V10_PACK_NAME


def test_v10_pack_loads_stronger_screen_content_guard():
    system = load_prompt("background_prompt", "system", version=_V10_PACK_NAME)
    user_template = load_prompt(
        "background_prompt", "user_template", version=_V10_PACK_NAME,
    )
    schema = load_schema("background_prompt", "schema", version=_V10_PACK_NAME)

    assert "W21B-wave-2.1 hard rule" in system
    assert "news anchor" in system
    assert "subtitle strip" in system
    assert "Screen / display / frame content policy" in user_template
    assert "unreadable abstract blocks only" in user_template
    assert "{transient_markers_block}" not in user_template
    assert set(schema["required"]) == {
        "bg_id",
        "t2i_prompt",
        "ref_guide",
        "shot_guides",
        "objects_owned_by_background",
    }


def test_v10_build_withholds_transient_screen_label_and_includes_policy():
    rendered = build_bg_user_prompt(
        bg_spec=_bg_spec(),
        floor_plan_path="/tmp/fp_l05_main.png",
        prior_bg_paths=[],
        scene_segments=[
            {
                "scene_index": 5,
                "heading": "probe",
                "text": "VERBATIM_SCENE_PROBE_LINE",
            }
        ],
        visual_world_rules="regional world rule body",
        source_language="ko",
        prompt_version="10",
        overlay_payload=_OVERLAY,
    )

    assert "surface_role: interior_room" in rendered
    assert "1. TV cabinet [fixture] — center wall" in rendered
    assert "news anchor face and subtitle ticker" not in rendered
    assert "inside TV screen" not in rendered
    assert "VERBATIM_SCENE_PROBE_LINE" not in rendered
    assert "Screen / display / frame content policy" in rendered
    assert "unreadable abstract blocks only" in rendered


def test_v10_fp_less_exterior_allows_missing_overlay():
    rendered = build_bg_user_prompt(
        bg_spec=_bg_spec("exterior_plate"),
        floor_plan_path="",
        prior_bg_paths=[],
        scene_segments=[],
        visual_world_rules="regional exterior rule",
        source_language="ko",
        prompt_version="10",
        overlay_payload=None,
    )

    assert "surface_role: exterior_plate" in rendered
    assert "fp-less surface plate" in rendered
    assert "regional exterior rule" in rendered
