#!/usr/bin/env bash
set -u
# ============================================================
#  MCP 生态使用大全 一键脚本（macOS / Linux / WSL）
#  公开源码，欢迎审查 —— 不放心可先复制给 AI 判断
#  功能：检查依赖 + 把最常用的 MCP 服务器注册进 Claude Code
#  模型端默认建议：云间 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"; }

CLOUDZONE_URL="https://cloudzone-api.cyou"

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
}

check_env() {
  step "检查运行环境（node / npx / claude）..."
  local ok=1
  if ! command -v node >/dev/null 2>&1; then
    warn "未找到 node.js——MCP 服务器大多靠它运行。"
    echo "  国内安装：https://npmmirror.com/mirrors/node/ 下载 LTS；海外：https://nodejs.org/"
    ok=0
  else
    info "node: $(node --version 2>&1)"
  fi
  if ! command -v npx >/dev/null 2>&1; then
    warn "未找到 npx（通常随 node 自带，检查 PATH）。"
    ok=0
  fi
  if ! command -v claude >/dev/null 2>&1; then
    warn "未找到 claude 命令——注册的 MCP 服务器要等安装 Claude Code 后才生效。"
    echo "  安装见本站《Claude Code 快速上手教程》或 https://code.claude.com/docs/en/start"
    ok=0
  else
    info "claude: $(claude --version 2>&1 | head -1)"
  fi
  [ "$ok" = "1" ] && step "环境就绪" || warn "环境不全（见上），脚本仍会尝试注册，失败项可在补装后重跑。"
  return 0
}

register_servers() {
  if ! command -v claude >/dev/null 2>&1; then
    warn "跳过注册（无 claude 命令）。安装 Claude Code 后手动执行："
    echo "  claude mcp add memory -- npx -y @modelcontextprotocol/server-memory"
    echo "  claude mcp add filesystem -- npx -y @modelcontextprotocol/server-filesystem <你的目录>"
    return 0
  fi

  step "注册 MCP 服务器到 Claude Code..."

  # 1. Memory
  if claude mcp add memory -- npx -y @modelcontextprotocol/server-memory 2>&1 | grep -qi "error\|fail"; then
    warn "memory 注册失败，可稍后手动：claude mcp add memory -- npx -y @modelcontextprotocol/server-memory"
  else
    info "memory 服务器已注册（跨会话记忆）"
  fi

  # 2. Fetch（抓网页）
  if claude mcp add fetch -- npx -y @modelcontextprotocol/server-fetch 2>&1 | grep -qi "error\|fail"; then
    warn "fetch 注册失败，可稍后手动：claude mcp add fetch -- npx -y @modelcontextprotocol/server-fetch"
  else
    info "fetch 服务器已注册（网页抓取）"
  fi

  # 3. Time（时间）
  if claude mcp add time -- npx -y @modelcontextprotocol/server-time 2>&1 | grep -qi "error\|fail"; then
    warn "time 注册失败，可稍后手动：claude mcp add time -- npx -y @modelcontextprotocol/server-time"
  else
    info "time 服务器已注册（时间与时区）"
  fi

  # 4. Filesystem（需要目录参数，询问用户）
  echo ""
  read -r -p "是否注册文件系统服务器？输入一个允许 AI 访问的目录（留空跳过）: " fs_dir
  if [ -n "${fs_dir:-}" ]; then
    if [ -d "$fs_dir" ]; then
      if claude mcp add filesystem -- npx -y @modelcontextprotocol/server-filesystem "$fs_dir" 2>&1 | grep -qi "error\|fail"; then
        warn "filesystem 注册失败，可稍后手动：claude mcp add filesystem -- npx -y @modelcontextprotocol/server-filesystem $fs_dir"
      else
        info "filesystem 服务器已注册（只允许访问 $fs_dir，安全）"
      fi
    else
      warn "目录不存在，跳过 filesystem 注册。"
    fi
  fi

  step "当前已注册列表："
  claude mcp list 2>&1 | head -20 || warn "claude mcp list 执行失败"
}

main() {
  echo "============================================"
  echo "  MCP 生态使用大全 一键脚本"
  echo "  适用于 macOS / Linux / WSL"
  echo "============================================"
  echo ""

  local NET
  NET=$(detect_network)

  # 国内 npm 镜像（加速 npx 下载）
  if [ "$NET" = "domestic" ] && command -v npm >/dev/null 2>&1; then
    if ! npm config get registry 2>/dev/null | grep -q npmmirror; then
      warn "设置 npm 为国内镜像（npmmirror）加速 MCP 服务器下载..."
      npm config set registry https://registry.npmmirror.com && info "已设置（改回官方：npm config set registry https://registry.npmjs.org）"
    fi
  fi

  check_env
  register_servers

  echo ""
  echo "============================================"
  info "全部完成！"
  echo "  在 Claude Code 里直接说需求即可体验：如'看看 memory 服务器能干什么'"
  echo "  更多服务器与命令见文章正文第七节速查表"
  echo "  模型端（Claude API）配置：${CLOUDZONE_URL}（Anthropic 兼容，CC MAX 0.5 倍起）"
  echo "============================================"
}

main "$@"