"""apply_episode_reference_policy_downgrade — text_only subject 다운그레이드."""
from app.core.subject_reference_policy import (
    apply_episode_reference_policy_downgrade,
)


def test_downgrade_injects_generic_for_missing_entry():
    out = apply_episode_reference_policy_downgrade(
        [], {"C08": "text_only low freq"}, where="t",
    )
    entry = next(i for i in out if i["subject_id"] == "C08")
    assert entry["policy"] == "generic_descriptor_allowed"
    assert entry["policy_type"] == "identity_reference"


def test_downgrade_overrides_id_and_outlook_required():
    items = [{"subject_id": "C08", "policy_type": "identity_reference",
              "policy": "id_and_outlook_required", "reason": "default"}]
    out = apply_episode_reference_policy_downgrade(
        items, {"C08": "text_only"}, where="t",
    )
    entry = next(i for i in out if i["subject_id"] == "C08")
    assert entry["policy"] == "generic_descriptor_allowed"


def test_downgrade_preserves_base_id_required():
    """base_id_required 는 의도적 partial-frame 정책 — 보존 (materialization
    reconciliation: 이 subject 는 required_ref 를 받아 Phase 1 보호됨)."""
    items = [{"subject_id": "C08", "policy_type": "identity_reference",
              "policy": "base_id_required", "reason": "explicit"}]
    out = apply_episode_reference_policy_downgrade(
        items, {"C08": "text_only"}, where="t",
    )
    entry = next(i for i in out if i["subject_id"] == "C08")
    assert entry["policy"] == "base_id_required"


def test_downgrade_noop_when_no_text_only():
    items = [{"subject_id": "C01", "policy_type": "identity_reference",
              "policy": "id_and_outlook_required", "reason": "x"}]
    assert apply_episode_reference_policy_downgrade(items, {}, where="t") == items


def test_downgrade_passthrough_non_list():
    assert apply_episode_reference_policy_downgrade(
        None, {"C08": "x"}, where="t") is None
