#!/usr/bin/env bash
# ============================================================
#  MCP Server 开发实战 一键脚本（macOS / Linux / WSL）
#  公开源码，欢迎审查 —— 不放心可先复制给 AI 判断
#  默认配置：云间 API 中转站（https://cloudzone-api.cyou/）
#  功能：检测网络 → 装 Python 依赖(uv) → 生成示例 server.py → 启动 MCP Inspector
# ============================================================

set -u

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

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"; }
fail()  { error "$1"; error "脚本无法继续。请把以上报错复制给 AI 或贴到 issue 求助。"; exit 1; }

# ---------- 第 0 步：检测网络环境（国内 / 国外）----------
detect_network() {
  step "检测网络环境（国内 / 国外）..."
  if curl -fsI --max-time 6 "https://pypi.org" >/dev/null 2>&1; then
    info "可直连 pypi.org，判定为海外网络"
    echo "overseas"
  else
    warn "无法直连 pypi.org，判定为国内网络环境，将使用清华/阿里 PyPI 镜像"
    echo "domestic"
  fi
}

# ---------- 第 1 步：检查 Python ≥ 3.10 ----------
check_python() {
  step "检查 Python 环境（需 3.10+）..."
  if ! command -v python3 >/dev/null 2>&1; then
    warn "未检测到 python3。请先安装 Python 3.10+（https://www.python.org/downloads/）"
    fail "python3 未安装"
  fi
  local PY_VER
  PY_VER=$(python3 -c 'import sys;print(f"{sys.version_info.major}.{sys.version_info.minor}")' 2>/dev/null || echo "0.0")
  local MAJOR MINOR
  MAJOR="${PY_VER%%.*}"
  MINOR="${PY_VER#*.}"
  if [ "$MAJOR" -lt 3 ] || { [ "$MAJOR" -eq 3 ] && [ "$MINOR" -lt 10 ]; }; then
    fail "Python 版本 $PY_VER 低于 3.10，请升级（MCP Python SDK 要求 3.10+）"
  fi
  info "Python $PY_VER 已就绪"
}

# ---------- 第 2 步：安装 uv（推荐方式装 mcp） ----------
install_uv() {
  local net="$1"
  step "安装 uv（Python 包管理器，推荐）..."
  if command -v uv >/dev/null 2>&1; then
    info "uv 已安装：$(uv --version 2>/dev/null || echo uv)"
    return 0
  fi
  if [ "$net" = "domestic" ]; then
    info "国内网络：用清华 PyPI 镜像装 uv"
    pip3 install --user -i https://pypi.tuna.tsinghua.edu.cn/simple uv >/dev/null 2>&1 \
      || pip3 install --user -i https://mirrors.aliyun.com/pypi/simple/ uv >/dev/null 2>&1 \
      || fail "uv 安装失败（pip3 镜像均不通）"
  else
    info "海外网络：官方脚本装 uv"
    curl -LsSf https://astral.sh/uv/install.sh -o /tmp/uv_install.sh 2>/dev/null
    [ -s /tmp/uv_install.sh ] && sh /tmp/uv_install.sh >/dev/null 2>&1 || pip3 install --user uv >/dev/null 2>&1 || fail "uv 安装失败"
    rm -f /tmp/uv_install.sh
    export PATH="$HOME/.local/bin:$HOME/.cargo/bin:$PATH"
  fi
  command -v uv >/dev/null 2>&1 || fail "uv 安装后仍不在 PATH，请手动装：pip3 install uv"
  info "uv 安装完成"
}

# ---------- 第 3 步：创建项目目录 + 示例 server.py ----------
create_server() {
  step "创建示例 MCP Server（add + greeting 两个工具）..."
  local DIR="$HOME/mcp-demo"
  mkdir -p "$DIR"
  cd "$DIR" || fail "无法进入 $DIR"

  # 初始化项目（国内用镜像源）
  if [ ! -f "pyproject.toml" ]; then
    info "初始化 uv 项目..."
    if [ "${1:-overseas}" = "domestic" ]; then
      UV_INDEX_URL="https://pypi.tuna.tsinghua.edu.cn/simple" uv init --no-readme >/dev/null 2>&1 \
        || UV_INDEX_URL="https://mirrors.aliyun.com/pypi/simple/" uv init --no-readme >/dev/null 2>&1
    else
      uv init --no-readme >/dev/null 2>&1
    fi
  fi

  info "安装 mcp[cli]..."
  if [ "${1:-overseas}" = "domestic" ]; then
    uv add "mcp[cli]" --index-url https://pypi.tuna.tsinghua.edu.cn/simple >/dev/null 2>&1 \
      || uv add "mcp[cli]" --index-url https://mirrors.aliyun.com/pypi/simple/ >/dev/null 2>&1 \
      || fail "mcp 安装失败（PyPI 镜像均不通）"
  else
    uv add "mcp[cli]" >/dev/null 2>&1 || fail "mcp 安装失败（pypi.org 不通？）"
  fi

  cat > server.py <<'PYEOF'
"""示例 MCP Server：add（加法）+ greeting（问候）两个工具。

启动后用 `mcp dev` 打开 Inspector 测试，或在 Claude Code 里把本文件作为 MCP server 接入。
"""
from mcp.server import MCPServer

mcp = MCPServer("Demo")


@mcp.tool()
def add(a: int, b: int) -> int:
    """Add two numbers."""
    return a + b


@mcp.resource("greeting://{name}")
def greeting(name: str) -> str:
    """Greet someone by name."""
    return f"Hello, {name}!"


if __name__ == "__main__":
    mcp.run()
PYEOF
  info "示例 server.py 已生成：$DIR/server.py"
  echo "$DIR"
}

# ---------- 第 4 步：（可选）引导配置 CZ API Key 接入 Claude Code ----------
setup_api_key() {
  echo ""
  echo "----------------------------------------"
  echo "想让 MCP Server 真正接入 Claude Code 跑起来？"
  echo "Claude Code 需调用 Anthropic API。国内直连 anthropic.com 受限，"
  echo "推荐用云间 API 中转站："
  echo "  · 价格低至官方两折，国内直连无需翻墙"
  echo "  · 支持 90+ 模型（Claude/GPT/DeepSeek），香港节点延迟低"
  echo ""
  echo "是否现在跳转注册并获取 API Key？"
  echo "  Y - 立即跳转至 ${CLOUDZONE_URL}"
  echo "  N - 我已有 Key，自行输入"
  read -r -p "请选择 [Y/N]: " choice

  local API_KEY=""
  if [ "${choice:-N}" = "Y" ] || [ "${choice:-N}" = "y" ]; then
    info "正在打开浏览器..."
    if command -v xdg-open >/dev/null 2>&1; then
      xdg-open "$CLOUDZONE_URL" >/dev/null 2>&1
    elif command -v open >/dev/null 2>&1; then
      open "$CLOUDZONE_URL" >/dev/null 2>&1
    else
      warn "无法自动打开浏览器，请手动访问：$CLOUDZONE_URL"
    fi
    echo "注册后在「我的 API Key」页面复制 Key（以 sk- 开头）。"
    read -r -p "粘贴你的 API Key: " API_KEY
  else
    # 关闭回显，避免 Key 明文留在终端滚动区
    read -r -s -p "请输入你的 API Key (sk-...): " API_KEY
    echo
  fi

  if [ -z "${API_KEY:-}" ]; then
    warn "未输入 API Key，跳过 Claude Code 配置。可稍后手动 export ANTHROPIC_API_KEY。"
    return 0
  fi

  # 写入 shell 配置（让 Claude Code 进程能读到）
  local RC=""
  [ -f "$HOME/.zshrc" ] && RC="$HOME/.zshrc"
  [ -f "$HOME/.bashrc" ] && [ -z "$RC" ] && RC="$HOME/.bashrc"
  if [ -n "$RC" ]; then
    # 去掉旧的 CZ 配置
    sed -i '/# CZ API config (cloudzone)/,/^export ANTHROPIC_BASE_URL=/d' "$RC" 2>/dev/null
    {
      echo "# CZ API config (cloudzone) - added by mcp-demo setup"
      echo "export ANTHROPIC_API_KEY=\"${API_KEY}\""
      echo "export ANTHROPIC_BASE_URL=\"${CLOUDZONE_API_BASE}\""
    } >> "$RC"
    info "已写入 $RC：ANTHROPIC_API_KEY + ANTHROPIC_BASE_URL"
    warn "新开终端才会生效。当前终端请手动执行：export ANTHROPIC_API_KEY=... ANTHROPIC_BASE_URL=$CLOUDZONE_API_BASE"
  else
    warn "未找到 .zshrc/.bashrc，请手动设置两个环境变量：ANTHROPIC_API_KEY / ANTHROPIC_BASE_URL"
  fi
}

# ---------- 主流程 ----------
main() {
  echo "============================================"
  echo "  MCP Server 开发实战 一键部署"
  echo "  macOS / Linux / WSL 版"
  echo "============================================"
  echo ""

  local NET
  NET=$(detect_network)

  check_python
  install_uv "$NET"
  local DIR
  DIR=$(create_server "$NET")

  echo ""
  step "启动 MCP Inspector 测试..."
  echo "示例 server 在：$DIR/server.py"
  echo "运行下面命令打开 Inspector（浏览器交互界面）："
  echo "  cd $DIR && uv run mcp dev server.py"
  echo ""
  echo "在 Inspector 里调用 add(1, 2) 应得 3，greeting('World') 返回 'Hello, World!'"
  echo ""

  # 可选：引导 CZ Key 接入 Claude Code
  read -r -p "是否现在配置云间 API Key 接入 Claude Code？[Y/N] " want_key
  if [ "${want_key:-N}" = "Y" ] || [ "${want_key:-N}" = "y" ]; then
    setup_api_key
  fi

  echo ""
  info "全部完成！详细说明见博客：https://cleanresolver.com/tutorials/mcp-server-develop-guide/"
  echo "完整脚本源码已在文末公开，也可从 /scripts/setup-mcp-demo.sh 下载"
}

main "$@"
