"""bare token(task-id 또는 task-group) → task-catalog.json 후보 entry 목록.

skill markdown 이 복제하던 "catalog 를 읽어 case-insensitive 매칭 → 0/1/N 분기" 를
단일 CLI 진입점으로 수렴시킨다. okstra_project.resolve_task_reference 가 SSOT 이고,
이 모듈은 project-root 해석 + JSON 정형화만 한다. token 은 task-id 와 task-group
두 축으로 매칭돼 합집합이 나온다(각 entry 의 _matchedVia 로 구분).
"""
from __future__ import annotations

import argparse
import json
import sys

from okstra_project import (
    ResolverError,
    StateError,
    resolve_project_root,
    resolve_task_reference,
)


def main(argv: list[str] | None = None) -> int:
    parser = argparse.ArgumentParser(
        description="Resolve a bare token (task-id or task-group) to candidate "
        "task-keys from the catalog."
    )
    parser.add_argument(
        "task_id", help="bare token: task-id or task-group (case-insensitive)"
    )
    parser.add_argument(
        "--task-group", default="", help="scope the task-id match to this task-group"
    )
    parser.add_argument("--project-root", default="", help="project root for catalog lookup")
    parser.add_argument("--cwd", default=".", help="cwd for project root resolution")
    parser.add_argument("--json", action="store_true", help="emit JSON (always on)")
    args = parser.parse_args(argv)

    try:
        project_root = resolve_project_root(explicit_root=args.project_root, cwd=args.cwd)
    except ResolverError as exc:
        print(json.dumps({"ok": False, "stage": "resolve", "reason": str(exc)}))
        return 2

    try:
        matches = resolve_task_reference(
            project_root, args.task_id, task_group=args.task_group or None
        )
    except StateError as exc:
        print(json.dumps({"ok": False, "stage": "catalog", "reason": str(exc)}))
        return 2

    print(json.dumps(
        {"ok": True, "projectRoot": str(project_root), "matches": matches},
        ensure_ascii=False, indent=2,
    ))
    return 0


if __name__ == "__main__":
    raise SystemExit(main(sys.argv[1:]))
