#!/bin/bash

# 一键部署脚本 - 部署代理服务器到远程服务器
# 使用方法: ./deploy.sh [server-host] [server-user]

set -e

# 颜色定义
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 获取脚本所在目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"

# 默认配置
REMOTE_HOST=${1:-""}
REMOTE_USER=${2:-"root"}
REMOTE_PORT=${3:-"22"}
REMOTE_DIR="/opt/proxy-server"
DOCKER_IMAGE="codelook/proxy-server"
DOCKER_TAG="latest"

# 检查并加载 .env 文件
ENV_FILE="$PROJECT_DIR/docker/.env"
if [ ! -f "$ENV_FILE" ]; then
    echo -e "${YELLOW}⚠️  未找到 .env 文件，创建默认配置...${NC}"
    cp "$PROJECT_DIR/docker/.env.example" "$ENV_FILE"
    echo -e "${YELLOW}请编辑 $ENV_FILE 设置你的配置，然后重新运行部署脚本${NC}"
    exit 1
fi

# 加载 .env 文件
echo -e "${BLUE}📋 加载环境配置...${NC}"
source "$ENV_FILE"

# 验证必要的环境变量
if [ -z "$PROXY_AUTH_TOKEN" ] || [ "$PROXY_AUTH_TOKEN" = "pst_YOUR_SECRET_TOKEN_HERE" ]; then
    echo -e "${RED}❌ 错误: 请在 .env 文件中设置 PROXY_AUTH_TOKEN${NC}"
    echo -e "${YELLOW}提示: 使用 'npx proxy-server generate-token' 生成一个新令牌${NC}"
    exit 1
fi

# 检查参数
if [ -z "$REMOTE_HOST" ]; then
    echo -e "${RED}错误: 请提供服务器地址${NC}"
    echo "使用方法: $0 <server-host> [server-user] [ssh-port]"
    echo "示例: $0 proxy.example.com root 22"
    exit 1
fi

echo -e "${BLUE}🚀 开始部署 HTTP 代理服务器${NC}"
echo -e "${BLUE}服务器: ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PORT}${NC}"
echo ""

# 1. 检查 SSH 连接
echo -e "${YELLOW}📡 检查 SSH 连接...${NC}"
if ! ssh -o ConnectTimeout=5 -p "$REMOTE_PORT" "$REMOTE_USER@$REMOTE_HOST" "echo 'SSH connection successful'" &>/dev/null; then
    echo -e "${RED}❌ 无法连接到服务器${NC}"
    exit 1
fi
echo -e "${GREEN}✅ SSH 连接成功${NC}"

# 显示配置信息
echo ""
echo -e "${BLUE}📌 部署配置：${NC}"
echo -e "  服务器: ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PORT}"
echo -e "  端口: ${PORT:-8080}"
echo -e "  认证: ${PROXY_AUTH_TOKEN:0:10}..."
echo -e "  日志级别: ${LOG_LEVEL:-info}"
echo -e "  速率限制: ${RATE_LIMIT_MAX:-100}/分钟"
echo ""

# 确认部署
read -p "$(echo -e ${YELLOW}确认部署？ [Y/n]: ${NC})" -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]] && [[ ! -z $REPLY ]]; then
    echo -e "${RED}取消部署${NC}"
    exit 1
fi

# 2. 构建 Docker 镜像
echo -e "${YELLOW}📦 构建 Docker 镜像...${NC}"
cd "$PROJECT_DIR"
docker build -t "$DOCKER_IMAGE:$DOCKER_TAG" .

# 3. 保存 Docker 镜像
echo -e "${YELLOW}💾 保存 Docker 镜像...${NC}"
docker save "$DOCKER_IMAGE:$DOCKER_TAG" | gzip > proxy-image.tar.gz

# 4. 创建临时 .env 文件（包含所有配置）
echo -e "${YELLOW}📝 准备环境配置...${NC}"
TEMP_ENV_FILE="/tmp/proxy-server.env.$$"
cp "$ENV_FILE" "$TEMP_ENV_FILE"

# 5. 上传文件
echo -e "${YELLOW}📤 上传文件到服务器...${NC}"
scp -P "$REMOTE_PORT" proxy-image.tar.gz "$REMOTE_USER@$REMOTE_HOST:/tmp/"
scp -P "$REMOTE_PORT" docker/docker-compose.yml "$REMOTE_USER@$REMOTE_HOST:/tmp/"
scp -P "$REMOTE_PORT" scripts/install.sh "$REMOTE_USER@$REMOTE_HOST:/tmp/"
scp -P "$REMOTE_PORT" "$TEMP_ENV_FILE" "$REMOTE_USER@$REMOTE_HOST:/tmp/proxy-server.env"

# 清理临时文件
rm -f "$TEMP_ENV_FILE"

# 6. SSH 远程执行部署
echo -e "${YELLOW}🔧 远程执行部署...${NC}"
ssh -p "$REMOTE_PORT" "$REMOTE_USER@$REMOTE_HOST" << EOF
set -e

# 运行安装脚本
echo "运行安装脚本..."
chmod +x /tmp/install.sh
/tmp/install.sh

# 创建目录
echo "创建项目目录..."
mkdir -p $REMOTE_DIR
cd $REMOTE_DIR

# 移动文件
mv /tmp/docker-compose.yml .
mv /tmp/proxy-server.env .env

# 加载 Docker 镜像
echo "加载 Docker 镜像..."
docker load < /tmp/proxy-image.tar.gz

# 停止旧容器
echo "停止旧容器..."
docker-compose down || true

# 启动新容器
echo "启动新容器..."
docker-compose up -d

# 等待服务启动
echo "等待服务启动..."
sleep 5

# 检查状态
docker-compose ps

# 清理
rm -f /tmp/proxy-image.tar.gz /tmp/install.sh

echo "✅ 部署完成！"
EOF

# 7. 清理本地文件
rm -f proxy-image.tar.gz

# 8. 显示部署信息
echo ""
echo -e "${GREEN}✨ 部署成功完成！${NC}"
echo ""
echo -e "${BLUE}代理服务器信息：${NC}"
echo -e "  地址: http://$REMOTE_HOST:${PORT:-8080}"
echo -e "  认证令牌: ${PROXY_AUTH_TOKEN}"
echo ""
echo -e "${YELLOW}使用方法：${NC}"
echo -e "1. 在 codem 中使用："
echo -e "   codem create myenv --proxy http://$REMOTE_HOST:${PORT:-8080}"
echo ""
echo -e "2. 使用 curl 测试："
echo -e "   curl -H \"Authorization: Bearer ${PROXY_AUTH_TOKEN}\" \\"
echo -e "        -H \"X-Target-URL: https://api.anthropic.com/health\" \\"
echo -e "        http://$REMOTE_HOST:${PORT:-8080}/"
echo ""
echo -e "3. 查看日志："
echo -e "   ssh $REMOTE_USER@$REMOTE_HOST 'cd $REMOTE_DIR && docker-compose logs -f'"
echo ""
echo -e "4. 管理服务："
echo -e "   ssh $REMOTE_USER@$REMOTE_HOST 'cd $REMOTE_DIR && docker-compose restart'  # 重启"
echo -e "   ssh $REMOTE_USER@$REMOTE_HOST 'cd $REMOTE_DIR && docker-compose down'     # 停止"
echo -e "   ssh $REMOTE_USER@$REMOTE_HOST 'cd $REMOTE_DIR && docker-compose up -d'    # 启动"
echo ""
echo -e "${GREEN}部署完成！代理服务器已在后台运行。${NC}"