"""shot_director SCHEMA_VERSION manifest ↔ step SOT 동기 가드.

직전 결함 (D6 history): manifest 의 schema_version 누락 또는 stale 시 step 이
cp 에 v=N stamp 후 다음 resume 에서 `_check_cp_mismatch` 가 manifest default
1 vs cp N 비교 → 무한 BLOCK 또는 stale resume. 같은 함정이 SCHEMA_VERSION
bump 마다 재발하지 않도록 SOT 직접 import 로 회귀 차단.

본 step 은 ``_LEGACY_SCHEMA_BUMP_ALLOWLIST`` 외 → cp_mismatch 시 자동
RERUN_SELF 안 됨. 운영자 명시 force 의무.
"""
from __future__ import annotations

from app.core.step_manifest import STEP_MANIFEST
from app.core.steps.shot_director_step import (
    SHOT_DIRECTOR_PROMPT_VERSION,
    SHOT_DIRECTOR_SCHEMA_VERSION,
)


def test_shot_director_manifest_schema_version_matches_step():
    """STEP_MANIFEST['shot_director'].schema_version 이 step 본체 상수와 일치.

    History:
        2026-05-10 SOT-drift fix (commit pending): 1→2. v1 cp 는 broad
        visible (description name match) 만 → off-camera/gaze-target 인물
        포함 → scene_detail Rule X-2 hard fail. v2 는 deterministic gaze
        제외 + variant LLM post-process + audit field
        (excluded_offscreen_entity_ids).
    """
    manifest_sv = STEP_MANIFEST["shot_director"].get("schema_version")
    assert manifest_sv == SHOT_DIRECTOR_SCHEMA_VERSION, (
        f"shot_director schema_version drift — manifest={manifest_sv}, "
        f"step constant={SHOT_DIRECTOR_SCHEMA_VERSION}. step_runner P0-3 "
        f"check 가 cp ↔ manifest 비교 — drift 시 모든 resume BLOCK."
    )


def test_shot_director_prompt_version_matches_pack_dir():
    """SHOT_DIRECTOR_PROMPT_VERSION 이 prompts/_base/shot_director/ 아래의
    실재하는 version directory 와 일치 — typo 회귀 차단.
    """
    from pathlib import Path
    from app.modules.prompt_loader import PROMPTS_BASE

    pack_dir = Path(PROMPTS_BASE) / "shot_director" / SHOT_DIRECTOR_PROMPT_VERSION
    assert pack_dir.exists() and pack_dir.is_dir(), (
        f"prompt pack 디렉토리 부재: {pack_dir}. "
        f"SHOT_DIRECTOR_PROMPT_VERSION={SHOT_DIRECTOR_PROMPT_VERSION} 가 "
        f"prompts/_base/shot_director/ 아래 실재 디렉토리와 동기 안 됨."
    )
    # pack completeness — strict mode 호환.
    for stem in ("system.md", "analyze.md", "analyze_schema.json"):
        assert (pack_dir / stem).exists(), (
            f"pack incomplete: {pack_dir / stem} 부재. "
            f"PROMPT_VERSION_PACK_STRICT 모드에서 RuntimeError 가능."
        )
