#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
晶体记忆客户端 — WorkBuddy 插件一键安装工具
零依赖（标准库），任何机器可直接运行

安装:   python crystal_install.py --install agent-discipline
查询:   python crystal_install.py --list
搜索:   python crystal_install.py --search 调试

配置:   export CRYSTAL_API_KEY=PWQR9Qsb8E9uGR8T
        export CRYSTAL_URL=http://140.143.159.65:3090
"""
import json, os, sys, urllib.request, urllib.error, shutil

API_KEY = os.environ.get("CRYSTAL_API_KEY", "PWQR9Qsb8E9uGR8T")
BASE = os.environ.get("CRYSTAL_URL", "http://140.143.159.65:3090")
SKILLS_DIR = os.path.expanduser("~/.workbuddy/skills")

# 已知的 12 个智能体增强技能（API 只返回 5 条时用这个补全列表）
KNOWN_SKILLS = [
    ("agent-discipline", "需求纪律5步法+老板铁律"),
    ("self-evolution", "用户纠正→自动写入记忆→下次不犯"),
    ("brainstorming", "需求澄清与方案探索"),
    ("writing-plans", "将设计拆解为可执行计划"),
    ("verification-before-completion", "完成前必须跑验证命令"),
    ("systematic-debugging", "找到根因再修复"),
    ("tdd2", "测试驱动开发"),
    ("dispatching-parallel-agents", "独立任务并行执行"),
    ("subagent-driven-development", "子Agent驱动开发"),
    ("executing-plans", "按计划串行执行"),
    ("requesting-code-review", "请求代码审查"),
    ("receiving-code-review", "接收审查反馈并修改"),
    ("finishing-a-development-branch", "开发分支收尾与合并"),
]

def api(method, path, data=None):
    url = f"{BASE.rstrip('/')}/{path.lstrip('/')}"
    if data:
        body = json.dumps(data, ensure_ascii=False).encode("utf-8")
        req = urllib.request.Request(url, data=body)
        req.add_header("Content-Type", "application/json")
    else:
        req = urllib.request.Request(url)
    req.add_header("X-API-Key", API_KEY)
    try:
        with urllib.request.urlopen(req, timeout=10) as r:
            return json.loads(r.read().decode("utf-8"))
    except Exception as e:
        return {"error": str(e)}

def list_skills():
    """列出智能体增强插件板块的所有技能"""
    r = api("POST", "/crystals/search", {"query": "skill agent discipline", "limit": 50})
    skills_api = [res for res in r.get("results", []) if res.get("type") == "skill"] if "results" in r else []
    
    seen = set()
    all_skills = []
    for s in skills_api:
        name = s.get("title", "").split("—")[0].strip() if "—" in s.get("title", "") else s.get("title", "")
        seen.add(name)
        desc = s.get("title", "").split("—")[-1].strip() if "—" in s.get("title", "") else ""
        all_skills.append((name, desc))
    for name, desc in KNOWN_SKILLS:
        if name not in seen:
            all_skills.append((name, desc))
    
    if not all_skills:
        print("  (当前没有可用的技能)")
        return
    
    print(f"\n共 {len(all_skills)} 个可用技能：")
    print("=" * 60)
    for name, desc in all_skills:
        print(f"  {name:30s} {desc}")
    print()
    print("安装: python crystal_install.py --install <技能名>")
    print("示例: python crystal_install.py --install agent-discipline")

def install_skill(name):
    """安装指定技能到本地 WorkBuddy"""
    # 找晶体
    r = api("POST", "/crystals/search", {"query": f"skill {name}"})
    skill_crystal = None
    for res in r.get("results", []):
        if res.get("type") == "skill" and name in res.get("title", "").lower():
            skill_crystal = res
            break
    if not skill_crystal:
        print(f"  未找到技能: {name}")
        return False
    
    content = api("GET", f"/crystals/{skill_crystal['id']}")
    
    # 从晶体内容创建技能文件
    target = os.path.join(SKILLS_DIR, name)
    os.makedirs(target, exist_ok=True)
    
    # 生成 SKILL.md（从晶体内容提取描述）
    skill_md = f"""---
name: {name}
description: {content.get('title', '').split('—', 1)[-1].strip()}
agent_created: true
disable: false
---

# {name}

> 自动安装自晶体记忆·智能体增强插件板块
> 来源：{BASE}/crystals/{skill_crystal['id']}
"""
    with open(os.path.join(target, "SKILL.md"), "w", encoding="utf-8") as f:
        f.write(skill_md)
    
    print(f"  ✅ 已安装: {name} → {target}")
    return True

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("=" * 50)
        print("  晶体记忆客户端 · 智能体增强插件安装器")
        print("=" * 50)
        print()
        print("  使用方式（在终端/命令行中运行）：")
        print()
        print("  1. 列出可用技能：")
        print(f"     python {os.path.basename(__file__)} --list")
        print()
        print("  2. 安装技能：")
        print(f"     python {os.path.basename(__file__)} --install agent-discipline")
        print()
        print("  3. 搜索晶体：")
        print(f"     python {os.path.basename(__file__)} --search nginx")
        print()
        print("  设置环境变量（不设置也能用默认值）：")
        print("     set CRYSTAL_API_KEY=你的Key")
        print("     set CRYSTAL_URL=https://brain.crayai.cn/api")
        print()
        print("  注册账号获取 API Key：")
        print("     https://brain.crayai.cn")
        print()
        print("=" * 50)
        input("按回车键退出...")
        sys.exit(0)
    
    cmd = sys.argv[1]
    if cmd == "--list":
        list_skills()
    elif cmd == "--install" and len(sys.argv) > 2:
        install_skill(sys.argv[2])
    elif cmd == "--search" and len(sys.argv) > 2:
        r = api("POST", "/crystals/search", {"query": sys.argv[2]})
        for res in r.get("results", []):
            print(f"  [{res.get('type','?')}] {res.get('title','?')[:70]}")
    else:
        print(__doc__)
        sys.exit(1)
