# -*- coding: utf-8 -*-
"""tests.regression.test_team_prompts_doctrine_injection — task-2640 Track B.

회장 verbatim unfork #4 — prompts/team_prompts.py 텍스트 + 코드 contract 연결.
SELF_COLLECTOR / SENDFILE_ONLY / NOT_REGISTERED verbatim doctrine block 이
prompt 본문에 자동 주입되는지 fixture 단언.

Layer A / NO-CRON: subprocess / cokacdir / merge / cron 호출 0.
"""
from __future__ import annotations

import importlib.util
import json
import os
import sys
from pathlib import Path

# task-2640 — tests/dispatch shadow 회피 + worktree 의 실 dispatch / prompts
# 모듈 강제 로드 (test_spawn_callback_contract_validator.py 와 동일 패턴).
_ROOT = Path(__file__).resolve().parents[2]
_TESTS_DIR = str(_ROOT / "tests")
sys.path[:] = [p for p in sys.path if p != _TESTS_DIR]
if str(_ROOT) not in sys.path:
    sys.path.insert(0, str(_ROOT))
for _m in [k for k in list(sys.modules) if k == "dispatch" or k.startswith("dispatch.")]:
    _cached = sys.modules.get(_m)
    _f = getattr(_cached, "__file__", "") or ""
    if "/tests/dispatch" in _f or _f == "":
        del sys.modules[_m]


def _load_real(modname: str, relpath: str):
    existing = sys.modules.get(modname)
    if existing is not None and getattr(existing, "__file__", "") and str(existing.__file__).endswith(relpath):
        return existing
    spec = importlib.util.spec_from_file_location(modname, _ROOT / relpath)
    assert spec is not None and spec.loader is not None, f"spec not found: {relpath}"
    mod = importlib.util.module_from_spec(spec)
    sys.modules[modname] = mod
    spec.loader.exec_module(mod)
    return mod


_load_real(
    "dispatch.spawn_callback_contract_validator",
    "dispatch/spawn_callback_contract_validator.py",
)

WORKSPACE = Path(__file__).resolve().parent.parent.parent
FIXTURE_DIR = (
    WORKSPACE / "tests" / "fixtures" / "self_collector_enforcement"
    / "prompt_level_self_collector_block"
)


def _load_fixture() -> tuple[dict, dict]:
    evidence = json.loads((FIXTURE_DIR / "evidence.json").read_text(encoding="utf-8"))
    expected = json.loads((FIXTURE_DIR / "expected.json").read_text(encoding="utf-8"))
    return evidence, expected


def test_build_self_collector_doctrine_block_verbatim_tokens() -> None:
    """_build_self_collector_doctrine_block 가 5축 토큰을 verbatim 포함한다."""
    from prompts.team_prompts import (
        ANU_NORMAL_COLLECTOR_KEY,
        SELF_COLLECTOR_DOCTRINE_HEADER,
        _build_self_collector_doctrine_block,
    )

    block = _build_self_collector_doctrine_block()
    assert SELF_COLLECTOR_DOCTRINE_HEADER in block
    assert ANU_NORMAL_COLLECTOR_KEY == "c119085addb0f8b7"
    assert ANU_NORMAL_COLLECTOR_KEY in block
    for token in ("SELF_COLLECTOR", "SENDFILE_ONLY", "NOT_REGISTERED"):
        assert token in block
    assert "collector_role=ANU" in block


def test_build_prompt_injects_doctrine_block_dev6_team() -> None:
    """team_prompts.build_prompt 가 doctrine block 을 자동 주입한다."""
    # ANU_KEY 환경변수 미설정 시 _get_anu_key() 가 fail-fast 하므로 임시 주입.
    os.environ.setdefault("COKACDIR_KEY_ANU", "c119085addb0f8b7")
    from prompts.team_prompts import (
        ANU_NORMAL_COLLECTOR_KEY,
        SELF_COLLECTOR_DOCTRINE_HEADER,
        build_prompt,
    )

    evidence, expected = _load_fixture()
    prompt = build_prompt(
        team_id=evidence["team_id"],
        task_id=evidence["task_id"],
        task_desc=evidence["task_desc"],
        level=evidence["level"],
        task_type=evidence["task_type"],
    )

    assert SELF_COLLECTOR_DOCTRINE_HEADER in prompt
    assert ANU_NORMAL_COLLECTOR_KEY in prompt
    for token in expected["tokens_required_in_prompt"]:
        assert token in prompt, (
            f"doctrine token {token!r} missing in prompt body"
        )


def test_build_prompt_doctrine_block_satisfies_spawn_validator() -> None:
    """doctrine block 주입 후 validate_spawn_callback_contract 가 PASS 한다."""
    os.environ.setdefault("COKACDIR_KEY_ANU", "c119085addb0f8b7")
    from dispatch.spawn_callback_contract_validator import (
        validate_spawn_callback_contract,
    )
    from prompts.team_prompts import build_prompt

    evidence, expected = _load_fixture()
    prompt = build_prompt(
        team_id=evidence["team_id"],
        task_id=evidence["task_id"],
        task_desc=evidence["task_desc"],
        level=evidence["level"],
        task_type=evidence["task_type"],
    )

    result = validate_spawn_callback_contract(
        task_id=evidence["task_id"],
        executor_key="1e41a2324a3ccdd0",  # dev6 페룬 (≠ anu_key)
        anu_key="c119085addb0f8b7",
        prompt_text=prompt,
    )
    expected_after = expected["validator_result_after_block_added"]
    assert result.verdict == expected_after["verdict"]
    assert result.prompt_has_anu_key == expected_after["prompt_has_anu_key"]
    assert result.prompt_has_collector_role == expected_after["prompt_has_collector_role"]
    assert result.prompt_has_required_doctrine == expected_after["prompt_has_required_doctrine"]
    assert result.classifications == []
