"""실내 pose 가이드 default-deny judge 평가 결정론 테스트 (Wave5, T4).

VLM 호출 아님 — verdict dict → attach gate 평가만(순수).
"""
from app.core.steps.indoor_pose_guide_judge import (
    evaluate_indoor_pose_guide_judge,
    resolve_single_shot_targets,
)

_EV = [{"shot_key": "1_1", "source_field": "frame_spatial_contract",
        "quote": "two figures, foreground/background"}]


def test_judge_attach_when_all_conditions_met():
    v = {"needs_indoor_pose_guide": True, "decision_type": "cross_shot_continuity",
         "confidence": "high", "evidence": _EV}
    assert evaluate_indoor_pose_guide_judge(v) == (True, None)


def test_judge_deny_no_need():
    assert evaluate_indoor_pose_guide_judge({"needs_indoor_pose_guide": False}) == (False, "judge_no_need")


def test_judge_admit_single_shot_decision():
    # 사용자 결정(2026-06-30): single_shot_complexity 도 group-level admit(shot-scoping 은
    # context 루프가 target_shot_keys + figure_count 로 좁힘).
    v = {"needs_indoor_pose_guide": True, "decision_type": "single_shot_complexity",
         "confidence": "high", "evidence": _EV, "target_shot_keys": ["1_1"]}
    assert evaluate_indoor_pose_guide_judge(v) == (True, None)


def test_judge_deny_no_guide_decision():
    v = {"needs_indoor_pose_guide": True, "decision_type": "no_guide",
         "confidence": "high", "evidence": _EV}
    assert evaluate_indoor_pose_guide_judge(v) == (False, "judge_no_guide_decision")


def test_resolve_single_shot_targets_parses_keys():
    assert resolve_single_shot_targets({"target_shot_keys": ["14_5", "14_8"]}) == {(14, 5), (14, 8)}
    assert resolve_single_shot_targets({"target_shot_keys": ["bad", "1_2_3", ""]}) == set()
    assert resolve_single_shot_targets({}) == set()


def test_judge_deny_low_confidence():
    v = {"needs_indoor_pose_guide": True, "decision_type": "both", "confidence": "low",
         "evidence": _EV}
    assert evaluate_indoor_pose_guide_judge(v) == (False, "judge_low_confidence")


def test_judge_deny_empty_evidence():
    v = {"needs_indoor_pose_guide": True, "decision_type": "both", "confidence": "high",
         "evidence": [{"shot_key": "", "source_field": "", "quote": ""}]}
    assert evaluate_indoor_pose_guide_judge(v) == (False, "judge_missing_evidence")


def test_judge_deny_malformed():
    assert evaluate_indoor_pose_guide_judge({}) == (False, "judge_failed")
    assert evaluate_indoor_pose_guide_judge(None) == (False, "judge_failed")
