"""task-2487+1 회귀 테스트: SSOT compat API + legacy dot-phase 호환."""
import pytest
from utils.task_id_parser import (  # type: ignore[import-not-found]
    is_valid_task_id,
    is_valid_task_id_with_legacy,
    TASK_ID_V2_PATTERN,
)


# V2 패턴 자체 무변경 검증 (read_only 정신 보존)
def test_v2_pattern_unchanged():
    expected = (
        r"^task-(?P<num>\d+)(?:_(?P<phase>\d+\.\d+))?"
        r"(?:_(?P<parallel>[a-z]))?(?:\+(?P<retry>\d+))?$"
    )
    assert TASK_ID_V2_PATTERN.pattern == expected


@pytest.mark.parametrize("tid", [
    "task-2485+1",
    "task-2487+1",
    "task-9.1",
    "task-648.1.dev1",
    "task-648.1.dev1.done",
    "task-1234.5",
    "task-9.1.done",
    "task-2469_1.2_a+3",
    "task-2469",
    "task-2469_1.2",
    "task-2469_1.2_a",
    "task-2469+0",
])
def test_compat_accepts(tid):
    assert is_valid_task_id_with_legacy(tid), f"compat regression: {tid} should PASS"


@pytest.mark.parametrize("invalid", [
    "",
    "not-a-task",
    "task-",
    "task-abc",
    "Task-2487",
    "task-2487!1",
    " task-2487 ",  # 단, strip이 적용되므로 "task-2487"가 PASS임 — 별도 케이스로 handling
])
def test_compat_rejects(invalid):
    if invalid.strip() == "task-2487":
        # strip 후 PASS 케이스
        return
    assert not is_valid_task_id_with_legacy(invalid), f"compat: {invalid!r} should REJECT"


def test_compat_handles_none_and_non_str():
    assert not is_valid_task_id_with_legacy(None)  # type: ignore
    assert not is_valid_task_id_with_legacy(12345)  # type: ignore


@pytest.mark.parametrize("v2_only", [
    "task-2485+1",
    "task-2487+1",
    "task-2469_1.2_a+3",
    "task-2469",
])
def test_v2_strict_accepts_v2(v2_only):
    """V2 strict 함수는 V2 패턴만 PASS"""
    assert is_valid_task_id(v2_only)


@pytest.mark.parametrize("legacy_only", [
    "task-9.1",
    "task-648.1.dev1.done",
    "task-1234.5",
])
def test_v2_strict_rejects_legacy(legacy_only):
    """V2 strict 함수는 legacy dot-phase REJECT (회귀 박제)"""
    assert not is_valid_task_id(legacy_only)
