"""tests/regression/test_dashboard_report_hardening_2487.py — task-2487 회귀 테스트 (Group C).

dashboard/helpers.py의 prefix 제거 정규식과 report_parser.py의 task_id 추출이
V2 패턴(retry/phase suffix)을 올바르게 처리하는지 검증한다.

헤임달(개발2팀 테스터) 작성 / task-2487.
"""
from __future__ import annotations

import importlib.util
import re
import sys
from pathlib import Path

WORKSPACE = Path(__file__).resolve().parents[2]


def _load_module(mod_name: str, file_rel: str):
    file_path = WORKSPACE / file_rel
    spec = importlib.util.spec_from_file_location(mod_name, str(file_path))
    if spec is None or spec.loader is None:
        raise ImportError(f"cannot load spec for {file_path}")
    module = importlib.util.module_from_spec(spec)
    sys.modules[mod_name] = module
    spec.loader.exec_module(module)
    return module


# dashboard/helpers.py는 Path(__file__) 기반 경로 계산만 하고 외부 I/O를 직접 실행하지 않으므로
# 직접 로드 가능.
helpers = _load_module("helpers_2487_dash", "dashboard/helpers.py")

# report_parser.py도 함수 정의만 있고 main 실행이 없으므로 직접 로드 가능.
rp = _load_module("report_parser_2487", "report_parser.py")


# ---------------------------------------------------------------------------
# 헬퍼: dashboard/helpers.py의 prefix 제거 정규식을 직접 테스트하기 위한 wrapper
# ---------------------------------------------------------------------------

# helpers.py에서 사용되는 prefix 제거 정규식 (3군데 동일 패턴 사용)
_DASH_PREFIX_RE = re.compile(
    r"^(?:task-\d+(?:_\d+\.\d+)?(?:_[a-z])?(?:\+\d+)?|Task\s+\d+[\.\d]*)\s*[:：]?\s*",
    re.IGNORECASE,
)


def _strip_prefix(title: str) -> str:
    return _DASH_PREFIX_RE.sub("", title).strip()


# ---------------------------------------------------------------------------
# C-1: dashboard prefix 제거 — V2 retry suffix
# ---------------------------------------------------------------------------


def test_dashboard_prefix_strip_retry():
    """'task-1234+1: 제목' → '제목' (retry suffix 제거)."""
    result = _strip_prefix("task-1234+1: 제목")
    assert result == "제목", f"expected '제목', got {result!r}"


def test_dashboard_prefix_strip_phase():
    """'task-1234_1.2: 제목' → '제목' (phase suffix 제거)."""
    result = _strip_prefix("task-1234_1.2: 제목")
    assert result == "제목", f"expected '제목', got {result!r}"


def test_dashboard_prefix_strip_phase_parallel_retry():
    """'task-1234_1.2_a+3: 긴 제목 텍스트' → '긴 제목 텍스트' (전체 V2 suffix 제거)."""
    result = _strip_prefix("task-1234_1.2_a+3: 긴 제목 텍스트")
    assert result == "긴 제목 텍스트", f"got {result!r}"


def test_dashboard_prefix_strip_base_only():
    """'task-1234: 기본 제목' → '기본 제목' (base ID만 있을 때도 제거)."""
    result = _strip_prefix("task-1234: 기본 제목")
    assert result == "기본 제목", f"got {result!r}"


def test_dashboard_prefix_strip_no_colon():
    """콜론 없는 'task-1234_1.2 제목' → '제목' (공백 구분도 처리)."""
    result = _strip_prefix("task-1234_1.2 제목")
    assert result == "제목", f"got {result!r}"


def test_dashboard_prefix_strip_plain_title():
    """task ID 없는 순수 제목은 변경되지 않는다."""
    result = _strip_prefix("순수한 제목 텍스트")
    assert result == "순수한 제목 텍스트", f"got {result!r}"


# ---------------------------------------------------------------------------
# C-2: dashboard/helpers.py 소스 내 V2 정규식 포함 확인
# ---------------------------------------------------------------------------


def test_dashboard_helpers_source_has_v2_pattern():
    """dashboard/helpers.py 소스에 V2 phase(_\\d+\\.\\d+) 패턴이 존재한다."""
    src = (WORKSPACE / "dashboard" / "helpers.py").read_text(encoding="utf-8")
    assert r"_\d+\.\d+" in src, (
        "dashboard/helpers.py prefix 제거 정규식에 V2 언더스코어 phase 토큰 없음"
    )


def test_dashboard_helpers_source_has_retry_pattern():
    """dashboard/helpers.py 소스에 V2 retry(+\\d+) 패턴이 존재한다."""
    src = (WORKSPACE / "dashboard" / "helpers.py").read_text(encoding="utf-8")
    assert r"\+\d+" in src, (
        "dashboard/helpers.py prefix 제거 정규식에 V2 retry(+\\d+) 토큰 없음"
    )


# ---------------------------------------------------------------------------
# C-3: report_parser.py — task_id 추출 V2 인식
# ---------------------------------------------------------------------------


def test_report_parser_task_id_from_title_base():
    """보고서 H1 '# task-1234 완료 보고서' 에서 task-1234 추출."""
    import tempfile, os

    content = "# task-1234 완료 보고서\n\n내용"
    with tempfile.NamedTemporaryFile(mode="w", suffix=".md", delete=False, encoding="utf-8") as f:
        f.write(content)
        tmp = f.name
    try:
        result = rp.parse_report(tmp)
        assert result["task_id"] == "task-1234", f"got {result['task_id']!r}"
    finally:
        os.unlink(tmp)


def test_report_parser_task_id_from_title_phase():
    """보고서 H1 '# task-1234_1.2 완료 보고서' 에서 task-1234_1.2 추출."""
    import tempfile, os

    content = "# task-1234_1.2 완료 보고서\n\n내용"
    with tempfile.NamedTemporaryFile(mode="w", suffix=".md", delete=False, encoding="utf-8") as f:
        f.write(content)
        tmp = f.name
    try:
        result = rp.parse_report(tmp)
        assert result["task_id"] == "task-1234_1.2", f"got {result['task_id']!r}"
    finally:
        os.unlink(tmp)


def test_report_parser_task_id_from_title_retry():
    """보고서 H1 '# task-1234+1 완료 보고서' 에서 task-1234+1 추출."""
    import tempfile, os

    content = "# task-1234+1 완료 보고서\n\n내용"
    with tempfile.NamedTemporaryFile(mode="w", suffix=".md", delete=False, encoding="utf-8") as f:
        f.write(content)
        tmp = f.name
    try:
        result = rp.parse_report(tmp)
        assert result["task_id"] == "task-1234+1", f"got {result['task_id']!r}"
    finally:
        os.unlink(tmp)


def test_report_parser_task_id_from_title_full_v2():
    """보고서 H1 '# task-1234_1.2_a+3' 에서 task-1234_1.2_a+3 추출."""
    import tempfile, os

    content = "# task-1234_1.2_a+3\n\n내용"
    with tempfile.NamedTemporaryFile(mode="w", suffix=".md", delete=False, encoding="utf-8") as f:
        f.write(content)
        tmp = f.name
    try:
        result = rp.parse_report(tmp)
        assert result["task_id"] == "task-1234_1.2_a+3", f"got {result['task_id']!r}"
    finally:
        os.unlink(tmp)


def test_report_parser_task_id_from_meta_field():
    """'**작업 ID**: task-1234_1.2' 메타 필드에서 V2 ID 추출."""
    import tempfile, os

    content = "# 완료 보고서\n\n- **작업 ID**: task-1234_1.2\n\n내용"
    with tempfile.NamedTemporaryFile(mode="w", suffix=".md", delete=False, encoding="utf-8") as f:
        f.write(content)
        tmp = f.name
    try:
        result = rp.parse_report(tmp)
        assert result["task_id"] == "task-1234_1.2", f"got {result['task_id']!r}"
    finally:
        os.unlink(tmp)


def test_report_parser_task_id_from_basename_v2():
    """파일명 'task-1234+1.md' 에서 basename으로 V2 ID 추출."""
    import tempfile, os

    content = "# 완료 보고서\n\n내용"
    # 파일명에 V2 ID 포함
    tmp_dir = tempfile.mkdtemp()
    tmp = os.path.join(tmp_dir, "task-1234+1.md")
    with open(tmp, "w", encoding="utf-8") as f:
        f.write(content)
    try:
        result = rp.parse_report(tmp)
        assert result["task_id"] == "task-1234+1", f"got {result['task_id']!r}"
    finally:
        os.unlink(tmp)
        os.rmdir(tmp_dir)


# ---------------------------------------------------------------------------
# C-4: report_parser.py merge_branch — V2 branch 패턴 인식
# ---------------------------------------------------------------------------


def test_report_parser_merge_branch_v2_phase():
    """'task/task-1234_1.2-dev2' 형식 merge_branch를 보고서에서 추출."""
    import tempfile, os

    content = "# 보고서\n\n머지 판단: 필요\n\nbranch: task/task-1234_1.2-dev2\n"
    with tempfile.NamedTemporaryFile(mode="w", suffix=".md", delete=False, encoding="utf-8") as f:
        f.write(content)
        tmp = f.name
    try:
        result = rp.parse_report(tmp)
        if result["merge_branch"]:
            assert "_1.2" in result["merge_branch"], (
                f"merge_branch {result['merge_branch']!r}에 phase suffix 없음"
            )
    finally:
        os.unlink(tmp)


def test_report_parser_merge_branch_v2_retry():
    """'task/task-1234+1-dev3' 형식 merge_branch를 보고서에서 추출."""
    import tempfile, os

    content = "# 보고서\n\n머지 판단: 필요\n\nbranch: task/task-1234+1-dev3\n"
    with tempfile.NamedTemporaryFile(mode="w", suffix=".md", delete=False, encoding="utf-8") as f:
        f.write(content)
        tmp = f.name
    try:
        result = rp.parse_report(tmp)
        if result["merge_branch"]:
            assert "+1" in result["merge_branch"], (
                f"merge_branch {result['merge_branch']!r}에 retry suffix 없음"
            )
    finally:
        os.unlink(tmp)


def test_report_parser_source_has_v2_title_pattern():
    """report_parser.py 소스의 H1 추출 정규식이 V2 suffix를 포함한다."""
    src = (WORKSPACE / "report_parser.py").read_text(encoding="utf-8")
    # H1 추출 정규식에 _\d+\.\d+ 와 +\d+ 이 모두 있어야 V2 호환
    assert r"_\d+\.\d+" in src, "report_parser.py H1 정규식에 V2 phase 패턴 없음"
    assert r"\+\d+" in src, "report_parser.py H1 정규식에 V2 retry 패턴 없음"
