"""`okstra worktree-lookup` / `okstra worktree-status` 의 핸들러.

원래 `src/commands/execute/worktree-{lookup,status}.mts` 의 문자열 리터럴 안에
있던 코드다(docs/coding-rules.md R1 위반). 로직은 그대로 옮겼다.
"""
from __future__ import annotations

import json
from dataclasses import asdict
from pathlib import Path

from . import worktree_registry
from .ids import _safe_fs_segment
from .worktree import (
    dirty_entries_excluding_okstra,
    is_git_work_tree,
    nested_worktree_excludes,
    okstra_clean_gate_excludes,
)


def _entry_payload(entry) -> dict:
    """registry 의 snake_case dataclass 를 CLI 의 camelCase 계약으로 옮긴다."""
    d = asdict(entry)
    return {
        "taskKey": d.get("task_key"),
        "projectId": d.get("project_id"),
        "taskGroup": d.get("task_group"),
        "taskId": d.get("task_id"),
        "worktreePath": d.get("worktree_path"),
        "branch": d.get("branch"),
        "baseRef": d.get("base_ref"),
        "createdAt": d.get("created_at"),
        "lastPhase": d.get("last_phase"),
        "status": d.get("status"),
    }


def lookup(args: argparse.Namespace) -> int:
    entry = worktree_registry.lookup(
        _safe_fs_segment(args.project_id),
        _safe_fs_segment(args.task_group),
        _safe_fs_segment(args.task_id),
    )
    if entry is None:
        print(json.dumps({"ok": True, "entry": None}))
        return 0
    print(json.dumps(
        {"ok": True, "entry": _entry_payload(entry)},
        ensure_ascii=False, default=str, indent=2,
    ))
    return 0


def status(args: argparse.Namespace) -> int:
    path = Path(args.path).resolve()
    if not path.is_dir():
        print(json.dumps({"ok": False, "stage": "input",
                          "reason": f"not a directory: {path}"}))
        return 2
    if not is_git_work_tree(path):
        print(json.dumps({"ok": False, "stage": "input",
                          "reason": f"not inside a git work tree: {path}"}))
        return 2

    entries = dirty_entries_excluding_okstra(path)
    excluded = [*okstra_clean_gate_excludes(path), *nested_worktree_excludes(path)]
    print(json.dumps({
        "ok": True,
        "path": str(path),
        "clean": not entries,
        "entries": entries,
        "excluded": excluded,
    }, ensure_ascii=False, indent=2))
    return 1 if (args.check_clean and entries) else 0
