#!/usr/bin/env bash
#!/usr/bin/env bash
set -u
# ============================================================
#  Chroma 向量数据库入门 一键脚本（macOS / Linux / WSL）
#  公开源码，欢迎审查 —— 不放心可先复制给 AI 判断
#  功能：检测环境 → 建 venv → 装 chromadb + openai → 跑 demo
#  默认配置：云间 API 中转站（https://cloudzone-api.cyou/）
# ============================================================

GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; CYAN='\033[0;36m'; NC='\033[0m'
info()  { echo -e "${GREEN}[INFO]${NC} $1"; }
warn()  { echo -e "${YELLOW}[WARN]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1"; }
step()  { echo -e "${CYAN}[STEP]${NC} $1"; }

detect_network() {
  step "检测网络环境（国内 / 国外）..."
  if curl -fsI --max-time 5 "https://claude.ai" >/dev/null 2>&1; then
    info "可直连 claude.ai，判定为海外网络"
    echo "overseas"
  else
    warn "无法直连 claude.ai，判定为国内网络环境（将自动切换国内镜像）"
    echo "domestic"
  fi
}

configure_api() {
  step "配置 API Key（可选，仅 RAG 问答部分需要）..."
  echo ""
  echo "是否需要使用 LLM 进行 RAG 问答演示？"
  echo "  Y - 使用云间 API 中转站（https://cloudzone-api.cyou/，注册送额度）"
  echo "  N - 跳过 LLM 部分，只跑向量检索演示"
  echo "  C - 我已有 Key，自行输入"
  read -r -p "请选择 [Y/N/C]: " choice

  if [ "${choice:-N}" = "N" ] || [ "${choice:-N}" = "n" ]; then
    warn "跳过 LLM 配置，将只演示 Chroma 向量检索（不含 RAG 问答）"
    export CHROMADB_USE_LLM="false"
    return 0
  fi

  local API_KEY=""
  local BASE_URL="https://cloudzone-api.cyou/v1"

  if [ "${choice:-N}" = "Y" ] || [ "${choice:-N}" = "y" ]; then
    info "正在打开浏览器跳转注册..."
    if command -v xdg-open >/dev/null 2>&1; then
      xdg-open "https://cloudzone-api.cyou" >/dev/null 2>&1
    elif command -v open >/dev/null 2>&1; then
      open "https://cloudzone-api.cyou" >/dev/null 2>&1
    else
      warn "无法自动打开浏览器，请手动访问：https://cloudzone-api.cyou"
    fi
    echo "注册后在「我的 API Key」页面复制 Key（以 sk- 开头）。"
    read -r -p "粘贴你的 API Key: " API_KEY
  else
    read -r -s -p "请输入你的 API Key (sk-...): " API_KEY
    echo
  fi

  if [ -z "${API_KEY:-}" ]; then
    warn "未输入 API Key，跳过配置。可稍后设置环境变量 CHROMADB_API_KEY。"
    export CHROMADB_API_KEY=""
    export CHROMADB_BASE_URL=""
    export CHROMADB_USE_LLM="false"
    return 0
  fi

  export CHROMADB_API_KEY="$API_KEY"
  export CHROMADB_BASE_URL="$BASE_URL"
  export CHROMADB_USE_LLM="true"

  info "配置完成！"
  echo "  API Key : ${API_KEY:0:10}********"
  echo "  Base URL: $BASE_URL"
  echo ""
}

run_demo() {
  local net="$1"
  step "生成并运行 Chroma 演示程序..."

  cat > chroma_demo.py <<'PYEOF'
"""Chroma 向量数据库最小演示（含可选 RAG 问答）"""
import os
import chromadb

# ===== 1. 初始化持久化客户端 =====
data_dir = "./chroma_rag_demo_db"
client = chromadb.PersistentClient(path=data_dir)

# ===== 2. 创建/获取 Collection =====
collection = client.get_or_create_collection("demo-knowledge")

# 检查是否已有数据，没有则插入
if collection.count() == 0:
    docs = [
        "Chroma 是一个开源的嵌入式向量数据库，安装只需 pip install chromadb。",
        "Chroma 支持持久化存储，使用 PersistentClient(path='/path') 即可把数据保存到磁盘。",
        "Chroma 的默认 Embedding 模型是 all-MiniLM-L6-v2，输出 384 维向量。",
        "可以通过 embedding_function 参数接入第三方 Embedding 如 OpenAI、Cohere、Ollama 等。",
        "RAG = Retrieval Augmented Generation，即检索增强生成：先用向量库找到相关文档，再交给 LLM 回答。",
    ]
    collection.add(
        ids=[f"doc{i}" for i in range(len(docs))],
        documents=docs,
    )
    print(f"[OK] 已插入 {len(docs)} 条知识文档")

# ===== 3. 向量检索演示 =====
print("\n===== 向量检索演示 =====")
queries = [
    "Chroma 怎么保存数据到磁盘？",
    "什么是 RAG？",
]

for q in queries:
    result = collection.query(query_texts=[q], n_results=2)
    print(f"\n问题: {q}")
    for i, doc in enumerate(result["documents"][0]):
        dist = result["distances"][0][i]
        print(f"  [{i+1}] (距离={dist:.3f}) {doc[:80]}...")

# ===== 4. RAG 问答（可选） =====
use_llm = os.environ.get("CHROMADB_USE_LLM", "false").lower()
if use_llm == "true":
    from openai import OpenAI
    api_key = os.environ.get("CHROMADB_API_KEY", "")
    base_url = os.environ.get("CHROMADB_BASE_URL", "https://cloudzone-api.cyou/v1")

    llm_client = OpenAI(api_key=api_key, base_url=base_url)

    print("\n===== RAG 问答演示 =====")
    question = input("请输入你的问题: ").strip()
    if not question:
        question = "Chroma 支持哪些 Embedding 模型？"

    # 检索相关文档
    result = collection.query(query_texts=[question], n_results=2)
    context = "\n".join(result["documents"][0])

    # 拼 Prompt 发给 LLM
    prompt = f"""基于以下参考资料回答问题：

参考资料：
{context}

用户问题：{question}

请用简洁的中文回答。"""

    try:
        resp = llm_client.chat.completions.create(
            model="text-embedding-3-small",
            messages=[{"role": "user", "content": prompt}],
            temperature=0.3,
        )
        print(f"\nAI 回答: {resp.choices[0].message.content}")
    except Exception as e:
        error(f"LLM 调用失败: {e}")
        print("提示：请检查 API Key 和 Base URL 是否正确")
else:
    print("\n[SKIP] 未配置 API Key，跳过 RAG 问答（如需开启请重新运行并选择 Y/C）")

print("\n===== 演示结束 =====")
PYEOF

  if ! python3 chroma_demo.py; then
    error "演示程序运行失败。常见原因："
    echo "  1. chromadb 未安装：python3 -m pip install chromadb"
    echo "  2. Python 版本过低：需要 3.9+"
    return 1
  fi

  info "演示完成！数据保存在 ./chroma_rag_demo_db/ 目录下"
  warn "想重新演示请先删除该目录：rm -rf chroma_rag_demo_db"
}

main() {
  echo "============================================"
  echo "  Chroma 向量数据库入门 一键脚本"
  echo "  适用于 macOS / Linux / WSL"
  echo "  默认接入：云间 API 中转站（可选）"
  echo "============================================"
  echo ""

  if ! command -v python3 >/dev/null 2>&1; then
    error "未检测到 python3。请先安装 Python 3.9+"
    echo "  Ubuntu/Debian: sudo apt install python3 python3-pip"
    echo "  macOS: brew install python3"
    echo "  WSL: sudo apt update && sudo apt install -y python3 python3-venv python3-pip"
    exit 1
  fi
  info "检测到 Python3: $(python3 --version 2>&1)"

  step "创建虚拟环境..."
  mkdir -p chroma-env && cd chroma-env || exit 1
  python3 -m venv .venv || { error "创建虚拟环境失败"; exit 1; }
  # shellcheck disable=SC1091
  source .venv/bin/activate || { warn "激活虚拟环境失败，继续使用系统 Python"; }
  info "虚拟环境就绪"

  local NET
  NET=$(detect_network)

  step "安装 chromadb 和 openai（${NET} 网络环境）..."
  local PIP_INDEX="https://pypi.org/simple"
  if [ "$NET" = "domestic" ]; then
    PIP_INDEX="https://pypi.tuna.tsinghua.edu.cn/simple"
  fi

  if pip install chromadb openai -i "$PIP_INDEX" --timeout 120 >/dev/null 2>&1; then
    info "安装成功"
  else
    warn "主源安装失败，回退官方源重试..."
    if pip install chromadb openai --timeout 120 >/dev/null 2>&1; then
      info "安装成功（官方源）"
    else
      error "安装失败。请手动执行以下命令："
      echo "  pip install chromadb openai -i https://pypi.tuna.tsinghua.edu.cn/simple"
      echo "  （海外用户去掉 -i 参数使用官方源）"
      exit 1
    fi
  fi

  configure_api

  run_demo "$NET"

  echo ""
  echo "============================================"
  info "全部完成！"
  echo "  演示数据: ./chroma_rag_demo_db/"
  echo "  脚本位置: chroma-env/chroma_demo.py"
  echo ""
  echo "  想用其他 OpenAI 兼容 API？"
  echo "  试试云间 API 中转站：https://cloudzone-api.cyou/"
  echo "    · OpenAI 兼容 + Anthropic 兼容"
  echo "    · 90+ 模型按量计费"
  echo "    · 国内直连无需翻墙，香港节点"
  echo "    · 价格不足官方两折，0.05x 起"
  echo "============================================"
}

main "$@"