#!/usr/bin/env bash
set -u
# ============================================================
#  Node.js 后端开发实战 — 一键安装脚本（macOS / Linux / WSL）
#  公开源码，欢迎审查 —— 不放心可先复制给 AI 判断
#  默认配置：云间 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
}

install_nvm() {
  step "安装 nvm（Node 版本管理器）..."
  if command -v nvm >/dev/null 2>&1; then
    info "nvm 已安装，跳过"
    return 0
  fi

  step "下载 nvm 安装脚本（主源）..."
  local script_file="/tmp/install-nvm.sh"
  if curl -fsSL --max-time 30 "https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh" -o "$script_file"; then
    bash "$script_file"
    rm -f "$script_file"
    export NVM_DIR="$HOME/.nvm"
    [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
    if nvm --version >/dev/null 2>&1; then
      info "nvm 安装成功：$(nvm --version)"
      return 0
    fi
  fi

  warn "主源安装失败，尝试 ghfast.top 镜像..."
  if curl -fsSL --max-time 30 "https://ghfast.top/https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh" -o "$script_file"; then
    bash "$script_file"
    rm -f "$script_file"
    export NVM_DIR="$HOME/.nvm"
    [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
    if nvm --version >/dev/null 2>&1; then
      info "nvm 安装成功（镜像源）：$(nvm --version)"
      return 0
    fi
  fi

  error "nvm 安装失败。请手动执行："
  echo "  curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash"
  echo "  然后新开终端窗口或 source ~/.bashrc"
  return 1
}

install_node() {
  step "安装 Node.js LTS ..."
  export NVM_DIR="${NVM_DIR:-$HOME/.nvm}"
  [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"

  nvm install --lts
  nvm alias default lts/*
  nvm use default

  if command -v node >/dev/null 2>&1; then
    info "Node.js 已安装：$(node --version)"
    info "npm 已安装：$(npm --version)"
    return 0
  fi
  error "Node.js 安装失败"
  return 1
}

setup_registry() {
  step "配置 npm 国内镜像 ..."
  npm config set registry https://registry.npmmirror.com
  info "npm registry → $(npm config get registry)"
}

install_express() {
  step "安装 Express ...（用于后续学习参考）"
  mkdir -p ~/nodejs-examples && cd ~/nodejs-examples || return 1
  npm init -y
  npm install express
  info "Express 安装完成"
}

configure_api() {
  step "配置 AI API Key ..."
  echo ""
  echo "下面的服务能让你的 Node.js 服务接入 AI 大模型，不需要自建服务器："
  echo "  · 价格不足官方两折，国内直连无需翻墙"
  echo "  · 支持 90+ 模型（OpenAI / Anthropic / 开源模型均兼容）"
  echo ""
  echo "是否跳转注册并获取 API Key？"
  echo "  Y - 立即跳转至 https://cloudzone-api.cyou/"
  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 "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
    error "未输入 API Key，跳过配置。可稍后手动设置。"
    return 1
  fi

  # 写入环境变量到 shell rc 文件
  local SHELL_RC=""
  case "${SHELL:/bin/bash}" in
    */zsh)  SHELL_RC="$HOME/.zshrc" ;;
    */bash) SHELL_RC="$HOME/.bashrc" ;;
    *)      SHELL_RC="$HOME/.profile" ;;
  esac

  info "写入环境变量到 $SHELL_RC"
  if [ -f "$SHELL_RC" ]; then
    sed -i.bak '/^export LLM_API_KEY/d; /^export LLM_BASE_URL/d' "$SHELL_RC"
  fi
  {
    echo ""
    echo "# Node.js AI 示例 - 云间 API 配置（一键脚本写入）"
    echo 'export LLM_API_KEY="'"$API_KEY"'"'
    echo 'export LLM_BASE_URL="https://cloudzone-api.cyou/v1"'
  } >> "$SHELL_RC"

  export LLM_API_KEY="$API_KEY"
  export LLM_BASE_URL="https://cloudzone-api.cyou/v1"

  info "配置完成！"
  echo "  API Key : ${API_KEY:0:10}********"
  echo "  Base URL: $LLM_BASE_URL"
  warn "新开终端后生效，或立即执行：source $SHELL_RC"
}

main() {
  echo "============================================"
  echo "  Node.js 后端开发实战 — 一键安装脚本"
  echo "  适用于 macOS / Linux / WSL"
  echo "  默认接入：云间 API 中转站"
  echo "============================================"
  echo ""

  local NET
  NET=$(detect_network)

  if ! install_nvm; then
    error "nvm 安装失败，脚本终止。请按上方提示手动处理后重跑。"
    exit 1
  fi

  if ! install_node; then
    error "Node.js 安装失败，脚本终止。"
    exit 1
  fi

  setup_registry
  install_express

  configure_api || warn "API Key 配置跳过，不影响 Node.js 运行"

  echo ""
  echo "============================================"
  info "全部完成！"
  echo "  Node.js: $(node --version)"
  echo "  npm:     $(npm --version)"
  echo "  nvm:     $(nvm --version)"
  echo "  项目目录: ~/nodejs-examples"
  echo "  运行示例: cd ~/nodejs-examples && node app.js"
  echo "============================================"
}

main "$@"
