#!/usr/bin/env python3
"""QC-RULES.md 의 '프롬프트 이관 지시' 절을 코드 canonical 본문과 동기화한다.

task-2950 (Lv.3+ 4096자 절벽 본수정):
    게이트 지시 / Codex 사전 검증 명령 / Sanitize 블록의 본문을 dispatch 프롬프트에서
    ``teams/shared/QC-RULES.md`` 로 verbatim 이관했다. 텍스트가 두 곳에 존재하면
    반드시 갈라지므로, canonical 은 코드
    (``prompts.team_prompts.build_qc_rules_transferred_sections``) 한 곳에 두고
    이 스크립트가 마크다운 쪽을 재생성한다.

Usage:
    python3 scripts/sync_qc_rules_sections.py           # 동기화 필요 여부만 검사
    python3 scripts/sync_qc_rules_sections.py --write    # 실제 기록

Exit code:
    0 = 이미 동기 상태(또는 --write 성공) / 1 = 동기화 필요(드리프트 감지)
"""

from __future__ import annotations

import argparse
import hashlib
import os
import sys
from pathlib import Path

WORKSPACE_ROOT = os.environ.get("WORKSPACE_ROOT", "/home/jay/workspace")
sys.path.insert(0, WORKSPACE_ROOT)

from prompts.team_prompts import (  # noqa: E402
    QC_RULES_PATH,
    build_qc_rules_transferred_sections,
)

BEGIN_MARKER = "<!-- BEGIN task-2950 transferred sections (generated) -->"
END_MARKER = "<!-- END task-2950 transferred sections (generated) -->"
ANCHOR = "## 변경 이력"


def render_region() -> str:
    """마커를 포함한 생성 영역 전체 텍스트."""
    return f"{BEGIN_MARKER}\n\n{build_qc_rules_transferred_sections()}\n{END_MARKER}"


def apply(text: str) -> str:
    """QC-RULES.md 본문에 생성 영역을 반영한 결과를 반환."""
    region = render_region()
    if BEGIN_MARKER in text and END_MARKER in text:
        head, rest = text.split(BEGIN_MARKER, 1)
        _, tail = rest.split(END_MARKER, 1)
        return f"{head}{region}{tail}"
    # 최초 삽입: '변경 이력' 직전에 새 절을 만든다.
    section = (
        "---\n\n"
        "## 7. 프롬프트 이관 지시 (task-2950, verbatim)\n\n"
        "> dispatch 프롬프트가 4096자 절벽(전달 채널 silent drop)을 넘지 않도록, 아래 지시\n"
        "> 본문을 프롬프트에서 이 파일로 이관했다. 프롬프트는 이 파일 경로 + sha256 short\n"
        "> 핀 + 절(§) 이름만 전달한다. 핀이 이 파일의 실제 sha256 앞자리와 다르면 읽은\n"
        "> 내용이 dispatch 시점과 다른 것이므로 그대로 진행하지 말고 보고한다.\n"
        ">\n"
        "> ★ 아래 생성 영역은 `prompts/team_prompts.py::build_qc_rules_transferred_sections()`\n"
        "> 출력과 **verbatim 일치**해야 한다(회귀 테스트가 강제). 직접 수정하지 말고\n"
        "> `python3 scripts/sync_qc_rules_sections.py --write` 로 재생성한다.\n\n"
    )
    if ANCHOR in text:
        head, tail = text.split(ANCHOR, 1)
        return f"{head}{section}{region}\n\n{ANCHOR}{tail}"
    return f"{text.rstrip()}\n\n{section}{region}\n"


def main() -> int:
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("--write", action="store_true", help="변경 사항을 파일에 기록")
    parser.add_argument("--path", default=QC_RULES_PATH, help="QC-RULES.md 경로")
    args = parser.parse_args()

    path = Path(args.path)
    current = path.read_text(encoding="utf-8")
    updated = apply(current)

    if current == updated:
        digest = hashlib.sha256(current.encode("utf-8")).hexdigest()[:12]
        print(f"[OK] 이미 동기 상태 · sha256:{digest} · {path}")
        return 0

    if not args.write:
        print(f"[DRIFT] 동기화 필요: {path}")
        print("      → python3 scripts/sync_qc_rules_sections.py --write")
        return 1

    path.write_text(updated, encoding="utf-8")
    digest = hashlib.sha256(updated.encode("utf-8")).hexdigest()[:12]
    print(f"[WROTE] {path} · sha256:{digest}")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
