"""tests/regression/test_scripts_hardening_2487.py — task-2487 회귀 (Group B, task-2547 corrected).

scripts/* 의 V2 + legacy dot-phase 호환 hardening 검증.

검증 대상:
- scripts/auto_merge.py        : _extract_all_task_ids V2+legacy 추출
- scripts/done-watcher.py      : _is_valid_task_id SSOT 위임
- scripts/notify-completion.py : _is_valid_task_id_with_legacy 검증
- scripts/pattern-detector.py  : extract_task_id_from_filename SSOT 위임
- scripts/report_utils.py      : extract_report_metadata title regex
- scripts/start_task_guard.py  : commit prefix V2 regex
- scripts/token-tracker.py     : TASK_RE V2+legacy loose pattern
"""
from __future__ import annotations

import re
from pathlib import Path

import pytest

WORKSPACE = Path(__file__).resolve().parents[2]
SCRIPTS = WORKSPACE / "scripts"

_SCRIPTS_SSOT_PENDING = (
    "main에 scripts SSOT 위임 미적용 (PR #97 corrected scope 4 files만 머지). "
    "task-2487 chain 후속 PR에서 scripts 계층 SSOT 확장 후 활성화 (회장 §명시 task-2551)."
)


def _read(rel: str) -> str:
    return (SCRIPTS / rel).read_text(encoding="utf-8")


@pytest.mark.skip(reason=_SCRIPTS_SSOT_PENDING)
def test_auto_merge_extracts_v2_legacy():
    src = _read("auto_merge.py")
    assert "_extract_all_task_ids" in src, "auto_merge.py missing _extract_all_task_ids helper"
    assert "is_valid_task_id_with_legacy" in src, "auto_merge.py missing SSOT import"


@pytest.mark.skip(reason=_SCRIPTS_SSOT_PENDING)
def test_done_watcher_uses_ssot_validator():
    src = _read("done-watcher.py")
    assert "is_valid_task_id_with_legacy" in src, "done-watcher.py missing SSOT import"
    assert "_is_valid_task_id(task_id)" in src, "done-watcher.py missing _is_valid_task_id call"


@pytest.mark.skip(reason=_SCRIPTS_SSOT_PENDING)
def test_notify_completion_uses_ssot_validator():
    src = _read("notify-completion.py")
    assert "is_valid_task_id_with_legacy" in src, "notify-completion.py missing SSOT import"
    assert "_is_valid_task_id(next_task_id)" in src, "notify-completion.py missing _is_valid_task_id call"
    # 기존 _RE_TASK_ID 인라인 정규식 제거 확인
    assert "_RE_TASK_ID = re.compile" not in src, (
        "notify-completion.py에 _RE_TASK_ID 인라인 패턴이 남아있음 — SSOT 위반"
    )


@pytest.mark.skip(reason=_SCRIPTS_SSOT_PENDING)
def test_pattern_detector_delegates_to_ssot():
    src = _read("pattern-detector.py")
    assert "_ssot_extract_task_id_from_filename" in src, (
        "pattern-detector.py missing SSOT delegation"
    )
    assert "from utils.task_id_parser import extract_task_id_from_filename" in src


@pytest.mark.skip(reason=_SCRIPTS_SSOT_PENDING)
def test_report_utils_title_regex_supports_v2():
    """extract_report_metadata 의 title 패턴이 V2 retry suffix를 인식하여 제거한다."""
    src = _read("report_utils.py")
    # 인라인 검증 — V2 패턴 마커
    assert "(?:\\+\\d+)?" in src, "report_utils.py title regex missing +retry token"


def test_start_task_guard_prefix_v2_regex():
    src = _read("start_task_guard.py")
    # commit prefix 패턴이 V2 retry/_phase/_parallel 을 포함하는지
    m = re.search(r"pattern\s*=\s*re\.compile\(r\"(.+?)\"\)", src)
    assert m, "start_task_guard.py에 pattern 정의 없음"
    pat = m.group(1)
    assert "_a" not in pat or "_[a-z]" in pat
    assert "+" in pat, f"pattern V2 retry suffix 누락: {pat}"


def test_token_tracker_task_re_supports_v2():
    """token-tracker.py TASK_RE 가 V2 retry/_phase suffix 를 포함하도록 loose pattern 으로 확장."""
    src = _read("token-tracker.py")
    # V2+legacy loose 패턴이 \w 또는 +,_ 를 허용해야 함
    m = re.search(r"TASK_RE\s*=\s*re\.compile\(r\"(.+?)\"\)", src)
    assert m, "token-tracker.py TASK_RE 정의 없음"
    pat = m.group(1)
    assert "+" in pat or "\\w" in pat, f"TASK_RE V2 suffix tolerance 누락: {pat}"
