"""requirements-discovery work-category(domain) SSOT.

profile / validators / wizard 는 이 모듈에서 enum 을 import 해야 한다. 다른 곳에서
재정의하면 single-reference-point 위반이며 tests/test_work_categories.py 가 거부한다.

다섯째 값은 `ops` 가 canonical 이다(`--work-category` CLI help 및 workflow.PHASE_RULES
와 일치). 구버전 비표준 철자는 폐기된다.
"""
from __future__ import annotations

import json
from pathlib import Path

from .paths import task_dir, task_manifest_file
from .json_boundary import JsonBoundaryError, load_owned_object

WORK_CATEGORIES: tuple[str, ...] = (
    "bugfix",
    "feature",
    "refactor",
    "ops",
    "improvement",
)

DEFAULT_WORK_CATEGORY = "feature"


def is_valid_category(value: str) -> bool:
    return value in WORK_CATEGORIES


def recorded_work_category(project_root: Path, task_group: str, task_id: str) -> str:
    """task-manifest.json 에 이미 기록된 work-category. 없거나 enum 밖이면 ""."""
    manifest = task_manifest_file(task_dir(project_root, task_group, task_id))
    try:
        data = load_owned_object(manifest, artifact="task manifest")
    except JsonBoundaryError:
        return ""
    value = str(data.get("workCategory") or "").strip()
    return value if is_valid_category(value) else ""


def resolve_work_category(
    explicit: str, *, project_root: Path, task_group: str, task_id: str
) -> str:
    """이번 run 이 실제로 쓸 work-category: 명시값 → task 에 기록된 분류 →
    DEFAULT_WORK_CATEGORY.

    requirements-discovery 가 분류를 task-manifest 에 기록해두면 이후 phase 는
    `--work-category` 없이 실행돼도 같은 branch namespace 로 수렴한다. 어느 쪽도
    없을 때 `unknown`(→ `task/` 접두) 대신 기본 분류로 떨어뜨린다.
    """
    value = (explicit or "").strip()
    if value:
        return value
    return (
        recorded_work_category(project_root, task_group, task_id)
        or DEFAULT_WORK_CATEGORY
    )
