#!/usr/bin/env bash
set -u
# ============================================================
#  提示词工程实战 一键脚本（macOS / Linux / WSL）
#  公开源码，欢迎审查 —— 不放心可先复制给 AI 判断
#  默认配置：云间 API 中转站（https://cloudzone-api.cyou/）
#  生成：prompt_demo.py（两种提示词实测对比）
# ============================================================

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"
CLOUDZONE_API_BASE="https://cloudzone-api.cyou/v1"

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_python() {
  step "检查 Python 3..."
  if command -v python3 >/dev/null 2>&1 && python3 --version >/dev/null 2>&1; then
    PY="python3"
    info "找到 python3：$(python3 --version 2>&1)"
    return 0
  fi
  error "未找到 python3。请先安装：https://www.python.org/downloads/ （Windows 建议使用 WSL 后执行本脚本）"
  return 1
}

setup_env() {
  local net="$1"
  step "创建虚拟环境并安装 anthropic SDK（约 1-2 分钟）..."
  mkdir -p prompt-demo && cd prompt-demo || return 1
  python3 -m venv .venv 2>/dev/null || { error "创建虚拟环境失败，手动执行：python3 -m venv .venv"; return 1; }
  # shellcheck disable=SC1091
  source .venv/bin/activate || { warn "激活虚拟环境失败，继续使用系统环境"; }

  step "安装 anthropic SDK..."
  local pypi="https://pypi.org/simple"
  if [ "$net" = "domestic" ]; then
    pypi="https://pypi.tuna.tsinghua.edu.cn/simple"
  fi

  if pip install anthropic -i "$pypi" --timeout 60 >/dev/null 2>&1; then
    info "SDK 安装成功"
    return 0
  fi
  warn "主源失败，回退备用镜像（阿里云 PyPI）..."
  if pip install anthropic -i "https://mirrors.aliyun.com/pypi/simple" --timeout 60 >/dev/null 2>&1; then
    info "备用镜像安装成功"
    return 0
  fi
  error "SDK 安装失败。请手动执行：pip install anthropic -i https://pypi.tuna.tsinghua.edu.cn/simple"
  return 1
}

configure_api() {
  step "配置 API Key..."
  echo ""
  echo "对比实验需要调用大模型 API。默认配置云间 API 中转站："
  echo "  · 一把 Key 调 Claude / GPT / DeepSeek / GLM 等 90+ 模型，方便对比"
  echo "  · 国内直连免翻墙，按 token 精确计费，Claude 系列约官方 0.4~0.6 倍起"
  echo ""
  echo "是否现在跳转注册并获取 API Key？"
  echo "  Y - 立即跳转至 ${CLOUDZONE_URL}"
  echo "  N - 我已有 Key（官方或第三方），自行输入"
  read -r -p "请选择 [Y/N]: " choice

  local API_KEY=""
  local BASE_URL="$CLOUDZONE_API_BASE"
  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 "注册后在控制台复制 Key（以 sk- 开头）。"
    read -r -p "粘贴你的 API Key: " API_KEY
    read -r -p "中转地址(直接回车用默认 ${CLOUDZONE_API_BASE}): " input_base
    [ -n "${input_base:-}" ] && BASE_URL="$input_base"
  else
    read -r -s -p "请输入你的 API Key (sk-...): " API_KEY
    echo
    echo "若使用 Anthropic 官方 Key：地址留空即可（默认 api.anthropic.com）。"
    read -r -p "API 地址(直接回车用默认 ${CLOUDZONE_API_BASE}): " input_base
    [ -n "${input_base:-}" ] && BASE_URL="$input_base"
  fi

  if [ -z "${API_KEY:-}" ]; then
    error "未输入 API Key，跳过配置。可稍后手动设置环境变量后重跑。"
    return 1
  fi

  local SHELL_RC=""
  case "$SHELL" in
    */zsh)  SHELL_RC="$HOME/.zshrc" ;;
    */bash) SHELL_RC="$HOME/.bashrc" ;;
    *)      SHELL_RC="$HOME/.profile" ;;
  esac

  info "写入环境变量到 $SHELL_RC（仅 ANTHROPIC_API_KEY 与 ANTHROPIC_BASE_URL 两个变量，原值备份 .bak）"
  if [ -f "$SHELL_RC" ]; then
    sed -i.bak '/ANTHROPIC_API_KEY/d; /ANTHROPIC_BASE_URL/d' "$SHELL_RC"
  fi
  {
    echo ""
    echo "# Prompt 对比实验 - 由一键脚本写入"
    echo "export ANTHROPIC_API_KEY=\"$API_KEY\""
    echo "export ANTHROPIC_BASE_URL=\"$BASE_URL\""
  } >> "$SHELL_RC"

  export ANTHROPIC_API_KEY="$API_KEY"
  export ANTHROPIC_BASE_URL="$BASE_URL"

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

write_demo() {
  step "生成对比实验脚本 prompt_demo.py ..."
  cat > prompt_demo.py <<'PYEOF'
import os
import anthropic

client = anthropic.Anthropic()

review = "鼠标收到当天就双击了，客服说是我的问题，售后形同虚设。"

prompt_a = f"帮我看看这条差评：\"{review}\" 评价一下严重程度，怎么办？"

prompt_b = f"""<role>
你是一名资深电商客服质检主管，评语客观、处理建议可落地。
</role>
<context>
严重程度分三级：S1 产品质量缺陷（须升级处理）/ S2 服务流程投诉（须改进）/ S3 一般负面情绪（安抚即可）。
输出必须为 JSON。
</context>
<task>
对下列差评：1) 定级（S1/S2/S3）2) 给出 20 字内结论 3) 给出 3 条按优先级排序的处理动作。
<examples>
{{"差评": "快递三天没动，客服一直复制粘贴。", "级别": "S2", "结论": "物流与客服双重失职", "动作": ["联系物流催件并致歉", "升级客服质检", "排查同类投诉"]}}
</examples>

<差评>{review}</差评>
</task>"""

def ask(prompt):
    msg = client.messages.create(
        model="claude-sonnet-5",
        max_tokens=600,
        messages=[{"role": "user", "content": prompt}],
    )
    return "".join(b.text for b in msg.content if b.type == "text")

print("=" * 56)
print("写法 A：普通人版")
print("=" * 56)
print(ask(prompt_a))

print()
print("=" * 56)
print("写法 B：工程化版（角色 + XML + 格式 + 示例）")
print("=" * 56)
print(ask(prompt_b))
PYEOF
  info "已生成 prompt-demo/prompt_demo.py"
}

main() {
  echo "============================================"
  echo "  提示词工程实战 一键脚本"
  echo "  适用于 macOS / Linux / WSL"
  echo "  默认接入：云间 API 中转站"
  echo "============================================"
  echo ""

  local NET
  NET=$(detect_network)

  if ! check_python; then
    error "缺少 Python 3，脚本终止。请先安装 Python 后重跑。"
    exit 1
  fi

  if ! setup_env "$NET"; then
    error "环境准备失败，脚本终止。请按上方提示手动处理。"
    exit 1
  fi

  configure_api || warn "Key 未配置，Demo 仍会生成，运行时需要先 export ANTHROPIC_API_KEY"

  write_demo

  echo ""
  echo "============================================"
  info "全部完成！运行对比实验："
  echo "    cd prompt-demo && source .venv/bin/activate && python prompt_demo.py"
  echo "（同一模型跑 A/B 两种提示词，直观感受模板的力量）"
  echo "============================================"
}

main "$@"