"""_build_bg_element_line tests — Patch C Area A Task 4.

5-class directive branching. element 문자열 자체는 어떤 임의 noun 이어도
directionality_class enum 만으로 동작 (G25 록인).
"""
import pytest

from app.core.steps.detail_steps import _build_bg_element_line


# G16: content_surface + orientation non-empty → directive 포함
def test_g16_content_surface_directive():
    line = _build_bg_element_line(
        element="any-element",
        state="held",
        camera_use="foreground",
        orientation="front face faces camera with content visible",
        directionality_class="content_surface",
    )
    assert "any-element" in line
    assert "[방향: front face faces camera with content visible]" in line
    assert "content-bearing surface" in line
    assert "front face faces camera with content visible" in line.split("\n")[-1]


# G17: reflective_surface + orientation non-empty → directive 포함
def test_g17_reflective_surface_directive():
    line = _build_bg_element_line(
        element="any-element",
        state="mounted",
        camera_use="frame edge",
        orientation="reflects subject's face from left",
        directionality_class="reflective_surface",
    )
    assert "reflecting surface" in line
    assert "reflects subject's face from left" in line
    assert "content-bearing surface" not in line


# G18: content_surface + orientation="" → directive 0 (defensive)
def test_g18_content_surface_empty_no_directive():
    line = _build_bg_element_line(
        element="any-element",
        state="held",
        camera_use="foreground",
        orientation="",
        directionality_class="content_surface",
    )
    assert "[방향:" not in line
    assert "content-bearing surface" not in line
    assert "reflecting surface" not in line


# G19: reflective_surface + orientation="" → directive 0 (defensive)
def test_g19_reflective_surface_empty_no_directive():
    line = _build_bg_element_line(
        element="any-element",
        state="mounted",
        camera_use="frame edge",
        orientation="",
        directionality_class="reflective_surface",
    )
    assert "[방향:" not in line
    assert "reflecting surface" not in line


# G20: transparent_surface + orientation non-empty → directive 0 (scope guard)
def test_g20_transparent_surface_no_directive():
    line = _build_bg_element_line(
        element="any-element",
        state="clean",
        camera_use="see-through",
        orientation="surface clean; subject visible behind it",
        directionality_class="transparent_surface",
    )
    assert "[방향: surface clean; subject visible behind it]" in line
    assert "content-bearing surface" not in line
    assert "reflecting surface" not in line


# G21: directional_3d + orientation non-empty → directive 0 (기존 동작 보존)
def test_g21_directional_3d_no_directive():
    line = _build_bg_element_line(
        element="any-element",
        state="powered on",
        camera_use="background",
        orientation="front face toward camera",
        directionality_class="directional_3d",
    )
    assert "[방향: front face toward camera]" in line
    assert "content-bearing surface" not in line


# G22: non_directional → directive 0
def test_g22_non_directional_no_directive():
    line = _build_bg_element_line(
        element="any-element",
        state="rain-slick",
        camera_use="texture",
        orientation="weathered surface",
        directionality_class="non_directional",
    )
    assert "[방향: weathered surface]" in line
    assert "content-bearing surface" not in line


# G23: legacy cp (directionality_class 누락) → directive 0
def test_g23_legacy_no_class_no_directive():
    line = _build_bg_element_line(
        element="any-element",
        state="held",
        camera_use="foreground",
        orientation="front face visible",
        directionality_class="",
    )
    assert "[방향: front face visible]" in line
    assert "content-bearing surface" not in line


# G24: unknown enum value → directive 0 (defensive)
def test_g24_unknown_enum_no_directive():
    line = _build_bg_element_line(
        element="any-element",
        state="held",
        camera_use="foreground",
        orientation="some orient",
        directionality_class="future_unknown_class",
    )
    assert "[방향: some orient]" in line
    assert "content-bearing surface" not in line
    assert "reflecting surface" not in line


# G25: element 문자열 무관 architecture 록인
@pytest.mark.parametrize(
    "element",
    [
        "snapshot",             # FLAT_NOUNS_EN 에 없던 단어
        "polaroid",             # 동의어
        "부적",                  # 한국어 작품 prop 묘사
        "monitor",              # 3D fixture noun
        "wooden deck",          # 비디렉셔널 noun
        "",                     # 빈 element
        "12345",                # 숫자
    ],
)
def test_g25_element_string_independent_when_class_emitted(element):
    """code 가 element 문자열 자체를 분류하지 않음을 록인.

    어떤 임의 element 라도 directionality_class="content_surface" 면
    directive 가 동작해야 한다.
    """
    line = _build_bg_element_line(
        element=element,
        state="state",
        camera_use="use",
        orientation="front face visible",
        directionality_class="content_surface",
    )
    assert "content-bearing surface" in line


# G26: orientation NL inline 은 모든 class 공통
def test_g26_orientation_inline_universal():
    for cls in ["content_surface", "reflective_surface", "transparent_surface",
                "directional_3d", "non_directional", "", "unknown"]:
        line = _build_bg_element_line(
            element="any",
            state="state",
            camera_use="use",
            orientation="some orientation",
            directionality_class=cls,
        )
        assert "[방향: some orientation]" in line, f"missing for class={cls!r}"
