#!/bin/bash
# 智队中枢自动更新脚本
# 当 Gitea 仓库有新提交时自动部署

set -e

# 配置
LOG_FILE="/var/log/pit-router-update.log"
REPO_DIR="/www/wwwroot/pit-router"
BACKUP_DIR="/www/wwwroot/pit-router-backups"

# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

# 创建备份
backup() {
    if [ -d "$REPO_DIR" ]; then
        mkdir -p "$BACKUP_DIR"
        BACKUP_NAME="pit-router-$(date '+%Y%m%d-%H%M%S').tar.gz"
        tar -czf "$BACKUP_DIR/$BACKUP_NAME" -C "$(dirname $REPO_DIR)" "$(basename $REPO_DIR)" 2>/dev/null || true
        log "备份创建: $BACKUP_NAME"
        
        # 只保留最近 5 个备份
        cd "$BACKUP_DIR"
        ls -t | tail -n +6 | xargs rm -f 2>/dev/null || true
        cd "$REPO_DIR"
    fi
}

# 回滚函数
rollback() {
    log "⚠️ 开始回滚..."
    LATEST_BACKUP=$(ls -t "$BACKUP_DIR" | head -1)
    if [ -n "$LATEST_BACKUP" ]; then
        cd "$BACKUP_DIR"
        tar -xzf "$LATEST_BACKUP" -C "$(dirname $REPO_DIR)"
        cd "$REPO_DIR"
        docker-compose -f docker-compose.prod.yaml up -d
        log "✅ 回滚完成"
    else
        log "❌ 没有可用的备份"
    fi
}

# 主流程
main() {
    log "========== 🚀 开始自动更新 =========="
    
    cd "$REPO_DIR" || exit 1
    
    # 1. 创建备份
    log "📦 创建备份..."
    backup
    
    # 2. 拉取最新代码
    log "📥 拉取最新代码..."
    git fetch origin
    git reset --hard origin/main
    
    # 记录当前 commit
    COMMIT=$(git rev-parse --short HEAD)
    log "当前版本: $COMMIT"
    
    # 3. 停止旧容器
    log "🛑 停止旧容器..."
    docker-compose -f docker-compose.prod.yaml down 2>/dev/null || true
    
    # 4. 构建新镜像
    log "🔨 构建新镜像..."
    docker-compose -f docker-compose.prod.yaml build --no-cache 2>&1 | tail -5
    
    # 5. 启动新容器
    log "🚀 启动新容器..."
    docker-compose -f docker-compose.prod.yaml up -d
    
    # 6. 等待健康检查
    log "⏳ 等待服务启动..."
    sleep 15
    
    # 7. 健康检查
    log "🏥 健康检查..."
    MAX_RETRIES=5
    RETRY_COUNT=0
    
    while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do
        if curl -sf http://localhost:1999/health > /dev/null 2>&1; then
            log "✅ 更新成功！服务运行正常"
            log "========== 🎉 更新完成 =========="
            exit 0
        fi
        
        RETRY_COUNT=$((RETRY_COUNT + 1))
        log "重试 $RETRY_COUNT/$MAX_RETRIES..."
        sleep 5
    done
    
    # 健康检查失败，回滚
    log "❌ 健康检查失败！"
    rollback
    log "========== ⚠️ 更新失败，已回滚 =========="
    exit 1
}

# 执行
main "$@"
