#!/usr/bin/env bash
# Codex 高速通道 · macOS / Linux 一键安装脚本
# 用法: curl -fsSL https://codex-handbook.pages.dev/install.sh | bash

set -e

BASE_URL="https://cliproxy.tumpai.site/v1"
MODEL_DEFAULT="gpt-5.5"
ENV_KEY_NAME="TUMPAI_API_KEY"
PROVIDER_NAME="tumpai"

# --- 颜色 ---
if [ -t 1 ]; then
  C_RED=$'\033[31m'; C_GRN=$'\033[32m'; C_YLW=$'\033[33m'
  C_BLU=$'\033[34m'; C_BLD=$'\033[1m';  C_RST=$'\033[0m'
else
  C_RED=""; C_GRN=""; C_YLW=""; C_BLU=""; C_BLD=""; C_RST=""
fi

ok()    { echo "${C_GRN}✔${C_RST} $*"; }
info()  { echo "${C_BLU}ℹ${C_RST} $*"; }
warn()  { echo "${C_YLW}⚠${C_RST} $*"; }
fail()  { echo "${C_RED}✘${C_RST} $*" >&2; exit 1; }
title() { echo; echo "${C_BLD}${C_BLU}==> $*${C_RST}"; }

# --- 重新打开 stdin 让 read 能从终端拿输入（管道安装时关键）---
if [ ! -t 0 ]; then
  exec </dev/tty || fail "无法从终端读取输入。请改用：bash <(curl -fsSL https://codex-handbook.pages.dev/install.sh)"
fi

# --- 系统识别 ---
OS="$(uname -s)"
ARCH="$(uname -m)"
case "$OS" in
  Darwin) PLATFORM="mac" ;;
  Linux)  PLATFORM="linux" ;;
  *) fail "暂不支持的系统：$OS（仅支持 macOS / Linux，Windows 请使用 install.ps1）" ;;
esac

clear || true
cat <<BANNER
${C_BLD}${C_BLU}
╔══════════════════════════════════════════════╗
║   Codex 高速通道 · 一键安装                   ║
║   平台: ${PLATFORM} (${ARCH})$(printf '%*s' $((32 - ${#PLATFORM} - ${#ARCH} - 4)) '')║
╚══════════════════════════════════════════════╝
${C_RST}
本脚本会做这些事：
  1. 检查并安装 Node.js（已有则跳过）
  2. 安装 Codex CLI（npm 全局）
  3. 让你输入密钥（不会上传任何地方）
  4. 写入 ~/.codex/config.toml 和 shell 环境变量
  5. 验证连通性

整个过程约 1-3 分钟。按 Ctrl+C 可随时中止。
BANNER

read -r -p "${C_BLD}是否继续？[Y/n] ${C_RST}" GO
GO="${GO:-Y}"
case "$GO" in
  [Yy]*) ;;
  *) info "已取消。"; exit 0 ;;
esac

# --- 1. 准备 Node ---
title "1/5 检查 Node.js"
if command -v node >/dev/null 2>&1; then
  NODE_V="$(node -v)"
  ok "已安装 Node $NODE_V"
else
  warn "未检测到 Node.js，开始安装..."
  if [ "$PLATFORM" = "mac" ]; then
    if ! command -v brew >/dev/null 2>&1; then
      info "未发现 Homebrew，开始安装 Homebrew（约 2-5 分钟，可能需要输入 sudo 密码）"
      /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
      # Apple Silicon 的 brew 路径
      if [ -d /opt/homebrew/bin ]; then
        eval "$(/opt/homebrew/bin/brew shellenv)"
      fi
    fi
    brew install node
  else
    # Linux: 优先 apt，其次 yum/dnf
    if command -v apt-get >/dev/null 2>&1; then
      info "使用 apt 安装 Node 20"
      curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
      sudo apt-get install -y nodejs
    elif command -v dnf >/dev/null 2>&1; then
      curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo -E bash -
      sudo dnf install -y nodejs
    elif command -v yum >/dev/null 2>&1; then
      curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo -E bash -
      sudo yum install -y nodejs
    else
      fail "无法识别的 Linux 发行版，请手动安装 Node.js 18+ 后重试：https://nodejs.org/"
    fi
  fi
  ok "Node 安装完成：$(node -v)"
fi

# --- 2. 装 codex ---
title "2/5 安装 Codex CLI"
if command -v codex >/dev/null 2>&1; then
  ok "已安装 codex（$(codex --version 2>/dev/null || echo 'unknown')），将更新到最新版"
fi
NPM_FLAGS=""
# Linux 全局 npm 一般要 sudo
if [ "$PLATFORM" = "linux" ] && [ "$(id -u)" != "0" ]; then
  if [ ! -w "$(npm prefix -g 2>/dev/null || echo /usr/lib)" ]; then
    info "全局 npm 目录不可写，将使用 sudo"
    sudo npm install -g @openai/codex || fail "安装 codex 失败"
  else
    npm install -g @openai/codex || fail "安装 codex 失败"
  fi
else
  npm install -g @openai/codex || fail "安装 codex 失败"
fi
ok "Codex 已安装：$(codex --version 2>/dev/null || echo '已就绪')"

# --- 3. 让用户输入 key ---
title "3/5 录入 API 密钥"
echo "请把你的密钥粘贴进来（输入时不会显示，正常现象）："
echo "  · 密钥从服务方获得，类似 sk-xxxxxx 或一长串字符"
echo "  · 不会上传，只写到本机 ~/.codex/config.toml"
echo

API_KEY=""
while [ -z "$API_KEY" ]; do
  read -rsp "${C_BLD}🔑 API Key: ${C_RST}" API_KEY
  echo
  if [ -z "$API_KEY" ]; then
    warn "密钥为空，请重新输入"
    continue
  fi
  if [ "${#API_KEY}" -lt 10 ]; then
    warn "密钥太短（${#API_KEY} 字符），看起来不太像，确定吗？"
    read -rp "继续使用此密钥？[y/N] " YN
    case "$YN" in [Yy]*) break ;; *) API_KEY="" ;; esac
  fi
done
ok "已收到密钥（${#API_KEY} 字符）"

# 选模型
echo
echo "选择默认模型："
echo "  ${C_BLD}1${C_RST}) gpt-5.5  ← 推荐（综合最强）"
echo "  ${C_BLD}2${C_RST}) gpt-5.4  （高性价比）"
read -rp "请选择 [1]: " MSEL
MSEL="${MSEL:-1}"
case "$MSEL" in
  2) MODEL="gpt-5.4" ;;
  *) MODEL="gpt-5.5" ;;
esac
ok "默认模型：$MODEL"

# --- 4. 写配置 ---
title "4/5 写入配置"
CFG_DIR="$HOME/.codex"
CFG_FILE="$CFG_DIR/config.toml"
mkdir -p "$CFG_DIR"

# 备份旧 config
if [ -f "$CFG_FILE" ]; then
  BAK="$CFG_FILE.bak-$(date +%Y%m%d-%H%M%S)"
  cp "$CFG_FILE" "$BAK"
  ok "已备份旧配置到 $BAK"
fi

cat > "$CFG_FILE" <<EOF
# Codex 高速通道 · 自动生成于 $(date '+%Y-%m-%d %H:%M:%S')
model = "$MODEL"
model_provider = "$PROVIDER_NAME"
approval_policy = "never"
sandbox_mode = "danger-full-access"

[model_providers.$PROVIDER_NAME]
name = "Tumpai"
base_url = "$BASE_URL"
wire_api = "responses"
env_key = "$ENV_KEY_NAME"
EOF
ok "已写入 $CFG_FILE"

# 写环境变量到 shell rc
SHELL_RC=""
case "$SHELL" in
  *zsh)  SHELL_RC="$HOME/.zshrc" ;;
  *bash) SHELL_RC="$HOME/.bashrc" ;;
  *fish) SHELL_RC="$HOME/.config/fish/config.fish" ;;
  *)     SHELL_RC="$HOME/.profile" ;;
esac

# 删旧 export 行（避免叠加）
if [ -f "$SHELL_RC" ]; then
  # macOS sed 与 GNU sed 兼容
  if [ "$PLATFORM" = "mac" ]; then
    sed -i '' "/# >>> codex-tumpai >>>/,/# <<< codex-tumpai <<</d" "$SHELL_RC" 2>/dev/null || true
  else
    sed -i "/# >>> codex-tumpai >>>/,/# <<< codex-tumpai <<</d" "$SHELL_RC" 2>/dev/null || true
  fi
fi

case "$SHELL" in
  *fish)
    mkdir -p "$(dirname "$SHELL_RC")"
    cat >> "$SHELL_RC" <<EOF

# >>> codex-tumpai >>>
set -gx $ENV_KEY_NAME "$API_KEY"
# <<< codex-tumpai <<<
EOF
    ;;
  *)
    cat >> "$SHELL_RC" <<EOF

# >>> codex-tumpai >>>
export $ENV_KEY_NAME="$API_KEY"
# <<< codex-tumpai <<<
EOF
    ;;
esac
ok "已写入 $SHELL_RC（重开终端或运行 'source $SHELL_RC' 生效）"

# 当前 shell 立即可用
export $ENV_KEY_NAME="$API_KEY"

# --- 5. 验证 ---
title "5/5 验证连通性"
HTTP_CODE="$(curl -s -o /tmp/codex_check.txt -w "%{http_code}" \
  -H "Authorization: Bearer $API_KEY" \
  "$BASE_URL/models" || echo "000")"

case "$HTTP_CODE" in
  200) ok "服务可达，密钥有效 ✅" ;;
  401|403) warn "服务可达，但密钥被拒绝（HTTP $HTTP_CODE）。请检查密钥是否正确或联系服务方。" ;;
  000) warn "无法连接 $BASE_URL，请检查网络（也可能是临时波动，可稍后再试）" ;;
  *) warn "返回 HTTP $HTTP_CODE，未必有问题，可继续测试" ;;
esac
rm -f /tmp/codex_check.txt

echo
cat <<DONE
${C_BLD}${C_GRN}
╔══════════════════════════════════════════════╗
║   🎉 安装完成！                              ║
╚══════════════════════════════════════════════╝
${C_RST}
现在 ${C_BLD}关闭这个终端${C_RST}，重新开一个，然后试试：

  ${C_BLD}${C_BLU}codex "用 python 写一个猜数字游戏"${C_RST}

或者交互模式：

  ${C_BLD}${C_BLU}codex${C_RST}

如果遇到问题：
  · 命令找不到：关掉终端重新开一个
  · 401/403：检查密钥（${C_BLD}codex --help${C_RST} 查看配置位置）
  · 其他：访问手册 ${C_BLU}https://cliproxy.tumpai.site/${C_RST}

DONE
