# -*- coding: utf-8 -*-
"""task-2686 regression — dispatch.prompt chair_facing_session_id inline 검증.

회장 verbatim 7 항목 중 #2 (dispatch prompt 에 chair_facing_session_id 전달).
본 테스트는 ``dispatch.prompt._inline_chair_facing_sid`` 가:
  - SID 명시 시 prompt 끝에 ``## ANU chair-facing session`` 헤더 + SID + resume
    플래그 + cokacdir 강제 라인을 append 하는지
  - SID 누락 시 prompt 변경 0 (byte-0 backwards compatible) 인지
  - 동일 SID 가 이미 inline 돼 있으면 멱등 (중복 inline 방지) 인지
검증한다.
"""
from __future__ import annotations

import sys
from pathlib import Path

_ROOT = Path(__file__).resolve().parents[3]
if str(_ROOT) not in sys.path:
    sys.path.insert(0, str(_ROOT))

# dispatch.prompt 는 dispatch/__init__ 본체 (utils.*, prompts.team_prompts) 에
# 의존 — 본 inline 함수만 핀포인트로 AST 추출 실행한다 (테스트 격리).
_PROMPT_TEXT = (_ROOT / "dispatch" / "prompt.py").read_text(encoding="utf-8")


def _extract_inline_helper():
    """dispatch/prompt.py 에서 _inline_chair_facing_sid + 헤더 상수만 추출 실행.

    dispatch 본체 (utils.*, prompts.team_prompts) 의존을 회피.
    """
    import ast

    tree = ast.parse(_PROMPT_TEXT)
    keep = []
    for node in tree.body:
        if isinstance(node, ast.Assign):
            targets = [t.id for t in node.targets if isinstance(t, ast.Name)]
            if "_CHAIR_FACING_SID_HEADER" in targets:
                keep.append(node)
        elif isinstance(node, ast.FunctionDef) and node.name == "_inline_chair_facing_sid":
            keep.append(node)
    module = ast.Module(body=keep, type_ignores=[])
    code = compile(module, str(_ROOT / "dispatch" / "prompt.py"), "exec")
    ns: dict = {}
    exec(code, ns)  # noqa: S102 — test-only AST 추출 실행
    return ns


_NS = _extract_inline_helper()
_inline_chair_facing_sid = _NS["_inline_chair_facing_sid"]
_HEADER = _NS["_CHAIR_FACING_SID_HEADER"]

CHAIR_SID = "53e89540-5bed-4692-a726-ed857820758a"
BASE_PROMPT = "# task md\n\nbody line 1\nbody line 2"


def test_inline_appends_header_and_sid():
    out = _inline_chair_facing_sid(BASE_PROMPT, CHAIR_SID)
    assert _HEADER in out
    assert f"chair_facing_session_id: {CHAIR_SID}" in out
    assert "callback_resume_required: true" in out
    assert f"--session {CHAIR_SID}" in out
    # 원문은 그대로 보존
    assert out.startswith(BASE_PROMPT)


def test_inline_skipped_when_sid_empty():
    assert _inline_chair_facing_sid(BASE_PROMPT, "") == BASE_PROMPT
    assert _inline_chair_facing_sid(BASE_PROMPT, None) == BASE_PROMPT


def test_inline_idempotent_when_header_already_present():
    once = _inline_chair_facing_sid(BASE_PROMPT, CHAIR_SID)
    twice = _inline_chair_facing_sid(once, CHAIR_SID)
    assert once == twice, "중복 inline 시 멱등이어야 한다 (header 검출로 skip)."


def test_inline_handles_empty_base_prompt():
    out = _inline_chair_facing_sid("", CHAIR_SID)
    assert _HEADER in out
    assert CHAIR_SID in out
