#!/usr/bin/env python3
"""作用域定位 CLI —— 候选值 → 5 棵树本地向量缓存余弦最近邻 top-K。

复用基建：scripts.scope_link.ScopeLinker（+ core.embedding + scope_trees/）。
从仓库根目录跑（自动 chdir）；需 .env 里的 ARK_* 与本地 scope_trees/（先跑 dump_trees+embed_trees）。

用法：
    python 创作知识提取-skill/tools/scope-link.py "撕裂共识" --type effect --top-k 5
    python 创作知识提取-skill/tools/scope-link.py "三幕结构" --type 形式
type 接受英文 key 或中文（不传则跨 5 棵树搜）。
"""
from __future__ import annotations

import argparse
import json
import os
import sys
from pathlib import Path

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

# scope_type 英文 → 树 source_type 中文（trees_index 里存中文）
_TYPE_MAP = {
    "substance": "实质", "form": "形式", "feeling": "感受",
    "effect": "作用", "intent": "意图",
    "实质": "实质", "形式": "形式", "感受": "感受", "作用": "作用", "意图": "意图",
}


def main() -> None:
    ap = argparse.ArgumentParser(description="作用域定位 top-K")
    ap.add_argument("candidate", help="候选作用域值，如 撕裂共识")
    ap.add_argument("--type", default=None, help="substance/form/feeling/effect/intent 或中文；不传=跨树")
    ap.add_argument("--top-k", type=int, default=5)
    args = ap.parse_args()

    os.chdir(REPO_ROOT)  # ScopeLinker 按 CWD 读 scope_trees/ 与 .env
    sys.path.insert(0, str(REPO_ROOT))
    from scripts.scope_link import ScopeLinker

    src = _TYPE_MAP.get(args.type, args.type) if args.type else None
    hits = ScopeLinker().link(args.candidate, source_type=src, top_k=args.top_k)
    print(json.dumps({"candidate": args.candidate, "type": src, "hits": hits},
                     ensure_ascii=False, indent=2))


if __name__ == "__main__":
    main()
