#!/usr/bin/env bash
# ==============================================================================
#  apicheap.store 1-Click Client Auto Setup Script
#  Comprehensive auto-configuration for macOS (MacBook zsh) & Linux (bash/zsh).
#  Automatically sets up Claude Code CLI, OpenAI Codex App / CLI, and environment.
# ==============================================================================

set -e

BASE_URL="https://apicheap.store"
DEFAULT_SUBAGENT=""
API_KEY="${QUOTAROUTER_API_KEY:-}"
MODEL="${QUOTAROUTER_MODEL:-}"
IS_EN=0
LANG_PARAM=""

for arg in "$@"; do
  case "$arg" in
    --lang=en|--en|-en|en|lang=en)
      IS_EN=1
      LANG_PARAM="en"
      ;;
    --lang=vi|--vi|-vi|vi|lang=vi)
      IS_EN=0
      LANG_PARAM="vi"
      ;;
    sk-*)
      [ -z "$API_KEY" ] && API_KEY="$arg"
      ;;
    *)
      if [ -z "$API_KEY" ] && [[ "$arg" =~ ^[a-zA-Z0-9_-]{20,}$ ]]; then
        API_KEY="$arg"
      elif [ -z "$MODEL" ] && [ "$arg" != "en" ] && [ "$arg" != "vi" ]; then
        MODEL="$arg"
      fi
      ;;
  esac
done

if [ -z "$LANG_PARAM" ]; then
  SYS_LANG="${QUOTAROUTER_LANG:-${LANG:-}}"
  if [[ "$SYS_LANG" =~ ^en ]] || [[ "$SYS_LANG" =~ ^C ]]; then
    IS_EN=1
  fi
fi

# Màu sắc hiển thị
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
MAGENTA='\033[0;35m'
GRAY='\033[0;90m'
BOLD='\033[1m'
NC='\033[0m'

echo ""
echo -e "${CYAN}========================================================${NC}"
echo -e "${YELLOW}${BOLD}       APICHEAP.STORE 1-CLICK CLIENT AUTO SETUP         ${NC}"
echo -e "${CYAN}         Online Gateway: ${BASE_URL}                    ${NC}"
echo -e "${CYAN}========================================================${NC}"
echo ""

# Phát hiện hệ điều hành
OS_TYPE="$(uname -s)"
case "${OS_TYPE}" in
  Darwin*)  OS_NAME="macOS (MacBook)" ;;
  Linux*)   OS_NAME="Linux" ;;
  *)        OS_NAME="${OS_TYPE}" ;;
esac
if [ $IS_EN -eq 1 ]; then
  echo -e "${GRAY}[i] Detected Operating System: ${BOLD}${OS_NAME}${NC}"
else
  echo -e "${GRAY}[i] Hệ điều hành phát hiện: ${BOLD}${OS_NAME}${NC}"
fi

# 1. Kiểm tra hoặc hỏi API Key
if [ -z "$API_KEY" ]; then
  EXISTING_KEY="${QUOTAROUTER_API_KEY:-${ANTHROPIC_AUTH_TOKEN:-}}"
  if [ -n "$EXISTING_KEY" ]; then
    KEY_PREV="${EXISTING_KEY:0:12}..."
    if [ $IS_EN -eq 1 ]; then
      echo -e "${GRAY}[?] Found existing API Key on machine: ${KEY_PREV}${NC}"
      read -r -p "    Do you want to continue using this key? (Y/n): " USE_EXISTING
    else
      echo -e "${GRAY}[?] Tìm thấy API Key hiện tại trên máy: ${KEY_PREV}${NC}"
      read -r -p "    Bạn có muốn tiếp tục dùng key này không? (Y/n): " USE_EXISTING
    fi
    if [[ "$USE_EXISTING" =~ ^[Yy]?$ ]]; then
      API_KEY="$EXISTING_KEY"
    fi
  fi
fi

while [ -z "$API_KEY" ]; do
  if [ $IS_EN -eq 1 ]; then
    read -r -p "[-] Please enter your apicheap.store API Key (sk-...): " API_KEY
  else
    read -r -p "[-] Vui lòng nhập API Key apicheap.store của bạn (sk-...): " API_KEY
  fi
  API_KEY="$(echo "$API_KEY" | xargs)"
done

# 2. Đọc danh sách Combo từ QuotaRouter & Gợi ý thông minh
COMBO_NAMES=()
COMBO_CHAINS=()

COMBO_RAW=$(curl -s -m 5 -H "Authorization: Bearer $API_KEY" "$BASE_URL/api/combos" 2>/dev/null || echo "")

if [ -n "$COMBO_RAW" ] && command -v node >/dev/null 2>&1; then
  COMBO_DATA=$(node -e "
    try {
      const data = JSON.parse(process.argv[1]);
      if (data.ok && Array.isArray(data.combos)) {
        data.combos.filter(c => c.status === 'active').forEach(c => {
          const chain = (c.members || []).map(m => m.model_id || m).join(' -> ');
          console.log(c.name + '|||' + chain);
        });
      }
    } catch (e) {}
  " "$COMBO_RAW" 2>/dev/null)

  while IFS= read -r line; do
    if [ -n "$line" ]; then
      name="${line%%|||*}"
      chain="${line##*|||}"
      COMBO_NAMES+=("$name")
      COMBO_CHAINS+=("$chain")
    fi
  done <<< "$COMBO_DATA"
fi

if [ -z "$MODEL" ]; then
  echo ""
  if [ ${#COMBO_NAMES[@]} -gt 0 ]; then
    if [ $IS_EN -eq 1 ]; then
      echo -e "${GREEN}${BOLD}[OK] FOUND ACTIVE COMBOS IN YOUR ACCOUNT:${NC}"
    else
      echo -e "${GREEN}${BOLD}[OK] TIM THAY DANH SACH COMBO TRONG TAI KHOAN CUA BAN:${NC}"
    fi
    for i in "${!COMBO_NAMES[@]}"; do
      num=$((i + 1))
      name="${COMBO_NAMES[$i]}"
      chain="${COMBO_CHAINS[$i]}"
      echo -e "  ${YELLOW}${num})${NC} ${BOLD}${name}${NC} ${GRAY}(Fallback: ${chain})${NC}"
    done
    echo ""
    DEFAULT_COMBO="${COMBO_NAMES[0]}"
    totalCombos=${#COMBO_NAMES[@]}
    if [ $IS_EN -eq 1 ]; then
      echo -e "${GRAY}[*] View all models & create new combos at: ${CYAN}$BASE_URL/portal#/models${NC}"
      read -r -p "[-] Select Combo [1-$totalCombos] or enter Model / Combo name (Default: 1 - $DEFAULT_COMBO): " USER_CHOICE
    else
      echo -e "${GRAY}[*] Xem danh sach Model & tao them Combo tai: ${CYAN}$BASE_URL/portal#/models${NC}"
      read -r -p "[-] Chon Combo [1-$totalCombos] hoac nhap ten Model / Combo khac (Mac dinh: 1 - $DEFAULT_COMBO): " USER_CHOICE
    fi
    USER_CHOICE="$(echo "$USER_CHOICE" | xargs)"
    
    if [ -z "$USER_CHOICE" ] || [ "$USER_CHOICE" = "1" ]; then
      MODEL="$DEFAULT_COMBO"
    elif [[ "$USER_CHOICE" =~ ^[0-9]+$ ]] && [ "$USER_CHOICE" -le "$totalCombos" ] && [ "$USER_CHOICE" -ge 1 ]; then
      idx=$((USER_CHOICE - 1))
      MODEL="${COMBO_NAMES[$idx]}"
    else
      MODEL="$USER_CHOICE"
    fi
  else
    if [ $IS_EN -eq 1 ]; then
      echo -e "${YELLOW}[i] No routing Combos found in your account.${NC}"
      echo -e "${CYAN}[*] -> View all available Models & create Combos at: ${BOLD}$BASE_URL/portal#/models${NC}"
      echo ""
      while [ -z "$MODEL" ]; do
        read -r -p "[-] Enter the Combo or Model name you want to use: " MODEL
        MODEL="$(echo "$MODEL" | xargs)"
        if [ -z "$MODEL" ]; then
          echo -e "${RED}[!] Please enter a valid Model or Combo name from $BASE_URL/portal#/models${NC}"
        fi
      done
    else
      echo -e "${YELLOW}[i] Tai khoan cua ban hien chua tao Combo dinh tuyen nao.${NC}"
      echo -e "${CYAN}[*] -> Xem danh sach Model & tao Combo tai: ${BOLD}$BASE_URL/portal#/models${NC}"
      echo ""
      while [ -z "$MODEL" ]; do
        read -r -p "[-] Nhap ten Combo hoac Model ban muon dung: " MODEL
        MODEL="$(echo "$MODEL" | xargs)"
        if [ -z "$MODEL" ]; then
          echo -e "${RED}[!] Vui long nhap ten Model hoac Combo (xem danh sach tren $BASE_URL/portal#/models)${NC}"
        fi
      done
    fi
  fi
fi

if [ -z "$DEFAULT_SUBAGENT" ]; then
  DEFAULT_SUBAGENT="$MODEL"
fi

# 3. Thiết lập biến môi trường vào RC files (~/.zshrc, ~/.bashrc)
echo ""
if [ $IS_EN -eq 1 ]; then
  echo -e "${GREEN}[1/4] Updating environment variables (~/.zshrc / ~/.bashrc)...${NC}"
else
  echo -e "${GREEN}[1/4] Đang cập nhật biến môi trường hệ thống (~/.zshrc / ~/.bashrc)...${NC}"
fi

RC_FILES=()
[ -f "$HOME/.zshrc" ] && RC_FILES+=("$HOME/.zshrc")
[ -f "$HOME/.bashrc" ] && RC_FILES+=("$HOME/.bashrc")
if [ ${#RC_FILES[@]} -eq 0 ]; then
  if [ -n "$ZSH_VERSION" ] || [ "$SHELL" = "/bin/zsh" ] || [ "$SHELL" = "/usr/bin/zsh" ] || [ "$OS_TYPE" = "Darwin" ]; then
    touch "$HOME/.zshrc"
    RC_FILES+=("$HOME/.zshrc")
  else
    touch "$HOME/.bashrc"
    RC_FILES+=("$HOME/.bashrc")
  fi
fi

ENV_SNIPPET=$(cat <<EOF
# --- apicheap.store Auto Configuration (https://apicheap.store) ---
  export ANTHROPIC_BASE_URL="$BASE_URL"
  export CLAUDE_CODE_API_BASE_URL="$BASE_URL"
  export ANTHROPIC_AUTH_TOKEN="$API_KEY"
export ANTHROPIC_MODEL="$MODEL"
export CLAUDE_DEFAULT_MODEL="$MODEL"
export ANTHROPIC_DEFAULT_SONNET_MODEL="$MODEL"
export ANTHROPIC_DEFAULT_OPUS_MODEL="$MODEL"
export ANTHROPIC_DEFAULT_HAIKU_MODEL="$DEFAULT_SUBAGENT"
export ANTHROPIC_SUBAGENT_MODEL="$DEFAULT_SUBAGENT"
export CLAUDE_CODE_SUBAGENT_MODEL="$DEFAULT_SUBAGENT"
export ANTHROPIC_FAST_MODEL="$DEFAULT_SUBAGENT"
  export ANTHROPIC_SMALL_FAST_MODEL="$DEFAULT_SUBAGENT"
  export QUOTAROUTER_API_KEY="$API_KEY"
  export OPENAI_BASE_URL="$BASE_URL/v1"
  export OPENAI_API_BASE="$BASE_URL/v1"
export OPENAI_API_KEY="$API_KEY"
# ----------------------------------------------------------
EOF
)

for RC in "${RC_FILES[@]}"; do
  if grep -q "apicheap.store Auto Configuration" "$RC" 2>/dev/null; then
    sed -i.bak '/# --- apicheap.store Auto Configuration/,/# ----------------------------------------------------------/d' "$RC" 2>/dev/null || true
  fi
  sed -i.bak '/^[[:space:]]*export[[:space:]]*ANTHROPIC_API_KEY=/d; /^[[:space:]]*export[[:space:]]*NINEROUTER_API_KEY=/d' "$RC" 2>/dev/null || true
  echo "" >> "$RC"
  echo "$ENV_SNIPPET" >> "$RC"
  if [ $IS_EN -eq 1 ]; then
    echo -e "  + Written configuration to: ${GRAY}${RC}${NC}"
  else
    echo -e "  + Đã ghi cấu hình vào: ${GRAY}${RC}${NC}"
  fi
done

# Export ngay trong phiên làm việc hiện tại
export ANTHROPIC_BASE_URL="$BASE_URL"
export CLAUDE_CODE_API_BASE_URL="$BASE_URL"
export ANTHROPIC_AUTH_TOKEN="$API_KEY"
export ANTHROPIC_MODEL="$MODEL"
export CLAUDE_DEFAULT_MODEL="$MODEL"
export ANTHROPIC_DEFAULT_SONNET_MODEL="$MODEL"
export ANTHROPIC_DEFAULT_OPUS_MODEL="$MODEL"
export ANTHROPIC_DEFAULT_HAIKU_MODEL="$DEFAULT_SUBAGENT"
export ANTHROPIC_SUBAGENT_MODEL="$DEFAULT_SUBAGENT"
export CLAUDE_CODE_SUBAGENT_MODEL="$DEFAULT_SUBAGENT"
export ANTHROPIC_FAST_MODEL="$DEFAULT_SUBAGENT"
export ANTHROPIC_SMALL_FAST_MODEL="$DEFAULT_SUBAGENT"
export QUOTAROUTER_API_KEY="$API_KEY"
export OPENAI_BASE_URL="$BASE_URL/v1"
export OPENAI_API_BASE="$BASE_URL/v1"
export OPENAI_API_KEY="$API_KEY"
unset ANTHROPIC_API_KEY NINEROUTER_API_KEY

# Cấu hình Claude Code CLI (~/.claude/settings.json)
mkdir -p "$HOME/.claude"
if [ ! -f "$HOME/.claude/settings.json" ]; then
  echo "{\"env\":{},\"model\":\"$MODEL\"}" > "$HOME/.claude/settings.json"
fi

if command -v node >/dev/null 2>&1; then
  node -e "
    const fs = require('fs');
    const file = process.argv[1];
    const key = process.argv[2];
    const model = process.argv[3];
    const url = process.argv[4];
    const sub = process.argv[5];
    const isEn = process.argv[6] === '1';
    try {
      let data = {};
      try { data = JSON.parse(fs.readFileSync(file, 'utf8')); } catch (e) {}
      if (!data.env) data.env = {};
      data.env.ANTHROPIC_BASE_URL = url;
      data.env.CLAUDE_CODE_API_BASE_URL = url;
      data.env.ANTHROPIC_AUTH_TOKEN = key;
      delete data.env.ANTHROPIC_API_KEY;
      delete data.env.NINEROUTER_API_KEY;
      data.env.ANTHROPIC_MODEL = model;
      data.env.CLAUDE_DEFAULT_MODEL = model;
      data.env.ANTHROPIC_DEFAULT_SONNET_MODEL = model;
      data.env.ANTHROPIC_DEFAULT_OPUS_MODEL = model;
      data.env.ANTHROPIC_DEFAULT_HAIKU_MODEL = sub;
      data.env.ANTHROPIC_SUBAGENT_MODEL = sub;
      data.env.CLAUDE_CODE_SUBAGENT_MODEL = sub;
      data.env.ANTHROPIC_FAST_MODEL = sub;
      data.env.ANTHROPIC_SMALL_FAST_MODEL = sub;
      data.model = model;
      fs.writeFileSync(file, JSON.stringify(data, null, 2), 'utf8');
      console.log(isEn ? '  + Updated ~/.claude/settings.json for Claude Code' : '  + Đã cập nhật ~/.claude/settings.json cho Claude Code');
    } catch (e) {}
  " "$HOME/.claude/settings.json" "$API_KEY" "$MODEL" "$BASE_URL" "$DEFAULT_SUBAGENT" "$IS_EN" 2>/dev/null || true
elif command -v python3 >/dev/null 2>&1; then
  python3 -c "
import sys, json
file, key, model, url, sub, is_en = sys.argv[1:7]
try:
    with open(file, 'r', encoding='utf-8') as f:
        data = json.load(f)
except Exception:
    data = {}
if 'env' not in data: data['env'] = {}
data['env']['ANTHROPIC_BASE_URL'] = url
data['env']['CLAUDE_CODE_API_BASE_URL'] = url
data['env']['ANTHROPIC_AUTH_TOKEN'] = key
data['env'].pop('ANTHROPIC_API_KEY', None)
data['env'].pop('NINEROUTER_API_KEY', None)
data['env']['ANTHROPIC_MODEL'] = model
data['env']['CLAUDE_DEFAULT_MODEL'] = model
data['env']['ANTHROPIC_DEFAULT_SONNET_MODEL'] = model
data['env']['ANTHROPIC_DEFAULT_OPUS_MODEL'] = model
data['env']['ANTHROPIC_DEFAULT_HAIKU_MODEL'] = sub
data['env']['ANTHROPIC_SUBAGENT_MODEL'] = sub
data['env']['CLAUDE_CODE_SUBAGENT_MODEL'] = sub
data['env']['ANTHROPIC_FAST_MODEL'] = sub
data['env']['ANTHROPIC_SMALL_FAST_MODEL'] = sub
data['model'] = model
with open(file, 'w', encoding='utf-8') as f:
    json.dump(data, f, indent=2)
print('  + Updated ~/.claude/settings.json for Claude Code' if is_en == '1' else '  + Đã cập nhật ~/.claude/settings.json cho Claude Code')
" "$HOME/.claude/settings.json" "$API_KEY" "$MODEL" "$BASE_URL" "$DEFAULT_SUBAGENT" "$IS_EN" 2>/dev/null || true
fi

# 4. Cấu hình OpenAI Codex App / CLI (~/.codex/config.toml)
echo ""
if [ $IS_EN -eq 1 ]; then
  echo -e "${GREEN}[2/4] Configuring Codex CLI / Codex Desktop App (~/.codex/config.toml)...${NC}"
else
  echo -e "${GREEN}[2/4] Đang cấu hình Codex CLI / Codex Desktop App (~/.codex/config.toml)...${NC}"
fi
mkdir -p "$HOME/.codex"
CODEX_CONFIG="$HOME/.codex/config.toml"

CODEX_BLOCK=$(cat <<EOF
model = "$MODEL"
model_provider = "quotarouter"

[model_providers.quotarouter]
name = "apicheap.store"
base_url = "$BASE_URL/v1"
env_key = "OPENAI_API_KEY"
wire_api = "responses"
http_headers = { Authorization = "Bearer $API_KEY" }

[model_providers.9router]
name = "apicheap.store"
base_url = "$BASE_URL/v1"
env_key = "OPENAI_API_KEY"
wire_api = "responses"
http_headers = { Authorization = "Bearer $API_KEY" }

[agents.subagent]
model = "$DEFAULT_SUBAGENT"
EOF
)

if [ -f "$CODEX_CONFIG" ]; then
  # Cập nhật model
  if grep -q '^model\s*=' "$CODEX_CONFIG"; then
    sed -i.bak "s|^model\s*=.*|model = \"$MODEL\"|" "$CODEX_CONFIG" 2>/dev/null || true
  else
    echo "model = \"$MODEL\"" | cat - "$CODEX_CONFIG" > "${CODEX_CONFIG}.tmp" && mv "${CODEX_CONFIG}.tmp" "$CODEX_CONFIG"
  fi

  # Cập nhật model_provider sang quotarouter
  if grep -q '^model_provider\s*=' "$CODEX_CONFIG"; then
    sed -i.bak 's|^model_provider\s*=.*|model_provider = "quotarouter"|' "$CODEX_CONFIG" 2>/dev/null || true
  else
    echo 'model_provider = "quotarouter"' | cat - "$CODEX_CONFIG" > "${CODEX_CONFIG}.tmp" && mv "${CODEX_CONFIG}.tmp" "$CODEX_CONFIG"
  fi

  # Nếu có block 9router cũ, chuyển sang quotarouter
  if grep -q '\[model_providers\.9router\]' "$CODEX_CONFIG"; then
    sed -i.bak 's|\[model_providers\.9router\]|[model_providers.quotarouter]|' "$CODEX_CONFIG" 2>/dev/null || true
    sed -i.bak 's|name\s*=\s*"9Router"|name = "apicheap.store"|' "$CODEX_CONFIG" 2>/dev/null || true
    sed -i.bak "s|base_url\s*=.*|base_url = \"$BASE_URL/v1\"|" "$CODEX_CONFIG" 2>/dev/null || true
    sed -i.bak 's|env_key\s*=.*|env_key = "OPENAI_API_KEY"|' "$CODEX_CONFIG" 2>/dev/null || true
    sed -i.bak 's|wire_api\s*=.*|wire_api = "responses"|' "$CODEX_CONFIG" 2>/dev/null || true
    if ! grep -q 'http_headers\s*=' "$CODEX_CONFIG"; then
      sed -i.bak "s|wire_api = \"responses\"|wire_api = \"responses\"\nhttp_headers = { Authorization = \"Bearer $API_KEY\" }|" "$CODEX_CONFIG" 2>/dev/null || true
    else
      sed -i.bak "s|http_headers\s*=.*|http_headers = { Authorization = \"Bearer $API_KEY\" }|" "$CODEX_CONFIG" 2>/dev/null || true
    fi
    if [ $IS_EN -eq 1 ]; then
      echo -e "  + Converted 9Router provider to apicheap.store in ${GRAY}${CODEX_CONFIG}${NC}"
    else
      echo -e "  + Đã chuyển đổi provider 9Router sang apicheap.store trong ${GRAY}${CODEX_CONFIG}${NC}"
    fi
  elif grep -q '\[model_providers\.quotarouter\]' "$CODEX_CONFIG"; then
    sed -i.bak "s|base_url\s*=.*|base_url = \"$BASE_URL/v1\"|" "$CODEX_CONFIG" 2>/dev/null || true
    sed -i.bak 's|env_key\s*=.*|env_key = "OPENAI_API_KEY"|' "$CODEX_CONFIG" 2>/dev/null || true
    sed -i.bak 's|wire_api\s*=.*|wire_api = "responses"|' "$CODEX_CONFIG" 2>/dev/null || true
    if ! grep -q 'http_headers\s*=' "$CODEX_CONFIG"; then
      sed -i.bak "s|wire_api = \"responses\"|wire_api = \"responses\"\nhttp_headers = { Authorization = \"Bearer $API_KEY\" }|" "$CODEX_CONFIG" 2>/dev/null || true
    else
      sed -i.bak "s|http_headers\s*=.*|http_headers = { Authorization = \"Bearer $API_KEY\" }|" "$CODEX_CONFIG" 2>/dev/null || true
    fi
    if [ $IS_EN -eq 1 ]; then
      echo -e "  + Updated apicheap.store provider in ${GRAY}${CODEX_CONFIG}${NC}"
    else
      echo -e "  + Đã cập nhật provider apicheap.store trong ${GRAY}${CODEX_CONFIG}${NC}"
    fi
  else
    echo "" >> "$CODEX_CONFIG"
    echo "$CODEX_BLOCK" >> "$CODEX_CONFIG"
    if [ $IS_EN -eq 1 ]; then
      echo -e "  + Added [model_providers.quotarouter] block to ${GRAY}${CODEX_CONFIG}${NC}"
    else
      echo -e "  + Đã thêm block [model_providers.quotarouter] vào ${GRAY}${CODEX_CONFIG}${NC}"
    fi
  fi
else
  echo "$CODEX_BLOCK" > "$CODEX_CONFIG"
  if [ $IS_EN -eq 1 ]; then
    echo -e "  + Created new config file ${GRAY}${CODEX_CONFIG}${NC}"
  else
    echo -e "  + Đã tạo mới tệp cấu hình ${GRAY}${CODEX_CONFIG}${NC}"
  fi
fi

# Cập nhật auth.json cho Codex
CODEX_AUTH="$HOME/.codex/auth.json"
cat > "$CODEX_AUTH" <<EOF
{
  "auth_mode": "apikey",
  "OPENAI_API_KEY": "$API_KEY",
  "QUOTAROUTER_API_KEY": "$API_KEY"
}
EOF
if [ $IS_EN -eq 1 ]; then
  echo -e "  + Updated apicheap.store API key into ${GRAY}${CODEX_AUTH}${NC}"
else
  echo -e "  + Đã cập nhật API key apicheap.store vào ${GRAY}${CODEX_AUTH}${NC}"
fi

# Tự động xác thực phiên qua codex login nếu có sẵn lệnh codex
if command -v codex >/dev/null 2>&1; then
  echo "$API_KEY" | codex login --with-api-key >/dev/null 2>&1 || true
  STATUS=$(codex login status 2>&1 || true)
  if [ $IS_EN -eq 1 ]; then
    echo -e "  + Codex CLI authentication confirmed: ${GREEN}${STATUS}${NC}"
  else
    echo -e "  + Xác thực thành công Codex CLI: ${GREEN}${STATUS}${NC}"
  fi
fi

# Đồng bộ các phiên cũ trong state_5.sqlite nếu có
CODEX_SQLITE="$HOME/.codex/state_5.sqlite"
if [ -f "$CODEX_SQLITE" ]; then
  if command -v sqlite3 >/dev/null 2>&1; then
    sqlite3 "$CODEX_SQLITE" "UPDATE threads SET model_provider = 'quotarouter' WHERE model_provider = '9router'; UPDATE threads SET model = '$MODEL' WHERE model = 'combocodex';" 2>/dev/null || true
  fi
  if [ -f "$HOME/.codex/session_index.jsonl" ]; then
    sed -i.bak 's/"9router"/"quotarouter"/g; s/"combocodex"/"'"$MODEL"'"/g' "$HOME/.codex/session_index.jsonl" 2>/dev/null || true
  fi
fi

# 5. Kiểm tra kết nối trực tuyến tới QuotaRouter
echo ""
if [ $IS_EN -eq 1 ]; then
  echo -e "${GREEN}[3/4] Checking live connection to ${BASE_URL}/v1/models...${NC}"
else
  echo -e "${GREEN}[3/4] Kiểm tra kết nối trực tiếp tới ${BASE_URL}/v1/models...${NC}"
fi
MODEL_RESPONSE=$(curl -fsS -H "Authorization: Bearer $API_KEY" "$BASE_URL/v1/models") || {
  if [ $IS_EN -eq 1 ]; then
    echo -e "${RED}[ERROR] Unable to load models list.${NC}"
  else
    echo -e "${RED}[LOI] Khong the tai danh sach model.${NC}"
  fi
  exit 1
}
MODEL_FOUND=0
if command -v node >/dev/null 2>&1; then
  MODEL_FOUND=$(node -e "try{const d=JSON.parse(process.argv[1]);process.stdout.write(Array.isArray(d.data)&&d.data.some(x=>x&&x.id===process.argv[2])?'1':'0')}catch(e){process.stdout.write('0')}" "$MODEL_RESPONSE" "$MODEL")
elif command -v python3 >/dev/null 2>&1; then
  MODEL_FOUND=$(python3 -c "import json,sys; d=json.loads(sys.argv[1]); print('1' if any(x.get('id') == sys.argv[2] for x in d.get('data', [])) else '0')" "$MODEL_RESPONSE" "$MODEL" 2>/dev/null || echo 0)
else
  printf '%s' "$MODEL_RESPONSE" | grep -Fq "\"$MODEL\"" && MODEL_FOUND=1
fi
if [ "$MODEL_FOUND" = "1" ]; then
  if [ $IS_EN -eq 1 ]; then
    echo -e "  ${GREEN}[OK] Live connection successful (HTTP 200)! Gateway is operating perfectly.${NC}"
  else
    echo -e "  ${GREEN}[OK] Kết nối trực tuyến thành công (HTTP 200)! Gateway đang hoạt động hoàn hảo.${NC}"
  fi
else
  if [ $IS_EN -eq 1 ]; then
    echo -e "  ${RED}[ERROR] Model / combo '$MODEL' is not available for this API key.${NC}"
  else
    echo -e "  ${RED}[LOI] Model / combo '$MODEL' khong co trong tai khoan hoac chua san sang.${NC}"
  fi
  exit 1
fi

# 6. Kiểm tra tình trạng công cụ trên máy
HAS_CLAUDE=0
if command -v claude >/dev/null 2>&1; then
  HAS_CLAUDE=1
fi

HAS_CODEX=0
if command -v codex >/dev/null 2>&1 || [ -d "/Applications/Codex.app" ]; then
  HAS_CODEX=1
fi

# 7. Hướng dẫn sử dụng & cách đổi Model sau này
echo ""
echo -e "${CYAN}========================================================${NC}"
if [ $IS_EN -eq 1 ]; then
  echo -e "${GREEN}${BOLD}               CONFIGURATION COMPLETED!                 ${NC}"
else
  echo -e "${GREEN}${BOLD}               CẤU HÌNH HOÀN TẤT THÀNH CÔNG!            ${NC}"
fi
echo -e "${CYAN}========================================================${NC}"
echo ""

if [ $IS_EN -eq 1 ]; then
  echo -e "${CYAN}${BOLD}[-] TOOL STATUS ON YOUR MACHINE:${NC}"
  if [ $HAS_CLAUDE -eq 1 ]; then
    echo -e "  * Claude Code CLI : ${GREEN}[INSTALLED] - Ready to use!${NC}"
  else
    echo -e "  * Claude Code CLI : ${YELLOW}[NOT INSTALLED] - Pre-configured!${NC}"
    echo -e "    ${GRAY}(Install anytime with: npm i -g @anthropic-ai/claude-code)${NC}"
  fi

  if [ $HAS_CODEX -eq 1 ]; then
    echo -e "  * OpenAI Codex    : ${GREEN}[INSTALLED] - Ready to use!${NC}"
  else
    echo -e "  * OpenAI Codex    : ${YELLOW}[NOT INSTALLED] - Pre-configured!${NC}"
    echo -e "    ${GRAY}(Install anytime with: npm i -g @openai/codex or download Codex Desktop App)${NC}"
  fi

  echo -e "  * IDEs & Editors  : ${GREEN}[100% READY] (Cursor, Windsurf, Cline, Roo, Continue)${NC}"
  echo -e "    ${GRAY}(All environment variables permanently saved to your shell profile)${NC}"

  echo ""
  echo -e "${CYAN}${BOLD}[-] HOW TO LAUNCH & USE:${NC}"
  if [ $HAS_CLAUDE -eq 1 ]; then
    echo -e "  ${YELLOW}${BOLD}1. CLAUDE CODE CLI:${NC}"
    echo -e "     Open a new Terminal (or run ${CYAN}source ~/.zshrc${NC} / ${CYAN}source ~/.bashrc${NC}) and run:"
    echo -e "     ${BOLD}claude${NC}"
  fi
  if [ $HAS_CODEX -eq 1 ]; then
    echo -e "  ${YELLOW}${BOLD}2. OPENAI CODEX (CLI or Desktop App):${NC}"
    echo -e "     If Codex App is open, please ${MAGENTA}QUIT AND REOPEN${NC} to reload apicheap.store."
    echo -e "     Or run in a new Terminal: ${BOLD}codex${NC}"
  fi
  if [ $HAS_CLAUDE -eq 0 ] && [ $HAS_CODEX -eq 0 ]; then
    echo -e "  ${YELLOW}-> System is fully pre-configured! You can:${NC}"
    echo -e "     1. Use directly in Cursor / Windsurf / VS Code immediately."
    echo -e "     2. Or install Claude Code:  ${CYAN}npm i -g @anthropic-ai/claude-code${NC}"
    echo -e "     3. Or install Codex CLI:    ${CYAN}npm i -g @openai/codex${NC}"
  fi

  echo ""
  echo -e "${CYAN}========================================================${NC}"
  echo -e "${YELLOW}${BOLD}      HOW TO SWITCH MODEL / COMBO AT ANY TIME           ${NC}"
  echo -e "${CYAN}========================================================${NC}"
  echo ""
  echo -e "${CYAN}${BOLD}A. SWITCH MODEL IN CLAUDE CODE CLI:${NC}"
  echo -e "   - ${BOLD}Method 1:${NC} Specify directly at startup:"
  echo -e "     ${BOLD}claude --model $MODEL${NC}"
  echo -e "   - ${BOLD}Method 2:${NC} Inside active Claude chat session, run:"
  echo -e "     ${BOLD}/model${NC}"
  echo -e "     then enter your desired model (e.g.: smart-live-combo or claude-3-5-sonnet)"
  echo -e "   - ${BOLD}Method 3:${NC} Re-run this script to pick a new default model."
  echo ""
  echo -e "${CYAN}${BOLD}B. SWITCH MODEL IN OPENAI CODEX APP / CLI:${NC}"
  echo -e "   - ${BOLD}Method 1 (Codex CLI):${NC} Add -m flag:"
  echo -e "     ${BOLD}codex -m $MODEL${NC}"
  echo -e "   - ${BOLD}Method 2 (Codex Desktop App):${NC}"
  echo -e "     Select desired model from dropdown or edit ~/.codex/config.toml"
  echo -e "   - ${BOLD}Method 3:${NC} Re-run this script to pick a new default model."
  echo ""
  echo -e "${CYAN}${BOLD}C. SWITCH MODEL IN CURSOR / WINDSURF:${NC}"
  echo -e "   - Go to Settings -> Models, change model name to your combo or model ID."
  echo ""
else
  echo -e "${CYAN}${BOLD}[-] TÌNH TRẠNG CÔNG CỤ TRÊN MÁY CỦA BẠN:${NC}"
  if [ $HAS_CLAUDE -eq 1 ]; then
    echo -e "  * Claude Code CLI : ${GREEN}[ĐÃ CÀI ĐẶT] - Sẵn sàng sử dụng!${NC}"
  else
    echo -e "  * Claude Code CLI : ${YELLOW}[CHƯA CÀI ĐẶT] - Đã cấu hình sẵn!${NC}"
    echo -e "    ${GRAY}(Khi cần, chỉ cần gõ: npm i -g @anthropic-ai/claude-code là dùng ngay)${NC}"
  fi

  if [ $HAS_CODEX -eq 1 ]; then
    echo -e "  * OpenAI Codex    : ${GREEN}[ĐÃ CÀI ĐẶT] - Sẵn sàng sử dụng!${NC}"
  else
    echo -e "  * OpenAI Codex    : ${YELLOW}[CHƯA CÀI ĐẶT] - Đã cấu hình sẵn!${NC}"
    echo -e "    ${GRAY}(Khi cần, chỉ cần gõ: npm i -g @openai/codex hoặc tải Codex Desktop App)${NC}"
  fi

  echo -e "  * IDEs & Editors  : ${GREEN}[SẴN SÀNG 100%] (Cursor, Windsurf, Cline, Roo, Continue)${NC}"
  echo -e "    ${GRAY}(Tất cả Biến môi trường đã được ghi vĩnh viễn vào shell profile)${NC}"

  echo ""
  echo -e "${CYAN}${BOLD}[-] CÁCH KHỞI ĐỘNG & SỬ DỤNG:${NC}"
  if [ $HAS_CLAUDE -eq 1 ]; then
    echo -e "  ${YELLOW}${BOLD}1. CLAUDE CODE CLI:${NC}"
    echo -e "     Mở Terminal mới (hoặc gõ ${CYAN}source ~/.zshrc${NC} / ${CYAN}source ~/.bashrc${NC}) và chạy:"
    echo -e "     ${BOLD}claude${NC}"
  fi
  if [ $HAS_CODEX -eq 1 ]; then
    echo -e "  ${YELLOW}${BOLD}2. OPENAI CODEX (CLI hoặc Desktop App):${NC}"
    echo -e "     Nếu đang mở Codex App, vui lòng ${MAGENTA}THOÁT HẲN VÀ MỞ LẠI${NC} để nạp apicheap.store."
    echo -e "     Hoặc chạy trên Terminal mới: ${BOLD}codex${NC}"
  fi
  if [ $HAS_CLAUDE -eq 0 ] && [ $HAS_CODEX -eq 0 ]; then
    echo -e "  ${YELLOW}-> Hệ thống đã cấu hình sẵn toàn bộ! Bạn có thể:${NC}"
    echo -e "     1. Dùng trực tiếp trên Cursor / Windsurf / VS Code ngay lập tức."
    echo -e "     2. Hoặc cài Claude Code:  ${CYAN}npm i -g @anthropic-ai/claude-code${NC}"
    echo -e "     3. Hoặc cài Codex CLI:    ${CYAN}npm i -g @openai/codex${NC}"
  fi

  echo ""
  echo -e "${CYAN}========================================================${NC}"
  echo -e "${YELLOW}${BOLD}      HƯỚNG DẪN ĐỔI MODEL / COMBO BẤT KỲ LÚC NÀO        ${NC}"
  echo -e "${CYAN}========================================================${NC}"
  echo ""
  echo -e "${CYAN}${BOLD}A. ĐỔI MODEL TRONG CLAUDE CODE CLI:${NC}"
  echo -e "   - ${BOLD}Cách 1:${NC} Chỉ định trực tiếp khi chạy:"
  echo -e "     ${BOLD}claude --model $MODEL${NC}"
  echo -e "   - ${BOLD}Cách 2:${NC} Trong phiên chat Claude đang mở, gõ lệnh:"
  echo -e "     ${BOLD}/model${NC}"
  echo -e "     rồi gõ tên model muốn đổi (ví dụ: smart-live-combo hoặc claude-3-5-sonnet)"
  echo -e "   - ${BOLD}Cách 3:${NC} Chạy lại script này để chọn lại model mặc định."
  echo ""
  echo -e "${CYAN}${BOLD}B. ĐỔI MODEL TRONG OPENAI CODEX APP / CLI:${NC}"
  echo -e "   - ${BOLD}Cách 1 (Codex CLI):${NC} Thêm cờ -m khi chạy:"
  echo -e "     ${BOLD}codex -m $MODEL${NC}"
  echo -e "   - ${BOLD}Cách 2 (Codex Desktop App):${NC}"
  echo -e "     Chọn model mong muốn trong danh sách hoặc sửa ~/.codex/config.toml"
  echo -e "   - ${BOLD}Cách 3:${NC} Chạy lại script này để chọn lại model mặc định."
  echo ""
  echo -e "${CYAN}${BOLD}C. ĐỔI MODEL TRONG CURSOR / WINDSURF:${NC}"
  echo -e "   - Vào Settings -> Models, đổi tên model thành combo hoặc model lẻ mong muốn."
  echo ""
fi
