#!/bin/bash

# Material Texture API 部署脚本
# 用法: ./deploy.sh [命令]
# 命令:
#   pack    - 打包项目用于传输
#   server  - 在服务器上执行部署
#   help    - 显示帮助

set -e

PROJECT_NAME="material_texture"
DEPLOY_DIR="deploy_package"
ARCHIVE_NAME="${PROJECT_NAME}_deploy.tar.gz"

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 本地打包（在开发机器上执行）
pack() {
    log_info "开始打包项目..."

    # 清理旧文件
    rm -rf "$DEPLOY_DIR" "$ARCHIVE_NAME"

    # 创建部署目录
    mkdir -p "$DEPLOY_DIR"

    # 复制必要文件（排除不需要的）
    rsync -av \
        --exclude='bin/' \
        --exclude='.git/' \
        --exclude='*.log' \
        --exclude='.env' \
        --exclude='.env.local' \
        --exclude='.DS_Store' \
        --exclude='deploy_package/' \
        --exclude='*.tar.gz' \
        . "$DEPLOY_DIR/"

    # 打包
    tar -czvf "$ARCHIVE_NAME" "$DEPLOY_DIR"

    # 清理临时目录
    rm -rf "$DEPLOY_DIR"

    # 显示文件大小
    SIZE=$(du -h "$ARCHIVE_NAME" | cut -f1)
    log_info "打包完成: $ARCHIVE_NAME ($SIZE)"
    log_info ""
    log_info "下一步: 将文件传输到服务器"
    echo "  scp $ARCHIVE_NAME user@your-server:/path/to/deploy/"
    log_info ""
    log_info "然后在服务器上执行:"
    echo "  tar -xzvf $ARCHIVE_NAME"
    echo "  cd $DEPLOY_DIR"
    echo "  ./deploy.sh server"
}

# 服务器部署（在服务器上执行）
server_deploy() {
    log_info "开始服务器部署..."

    # 检查 Docker
    if ! command -v docker &> /dev/null; then
        log_error "Docker 未安装，请先安装 Docker"
        exit 1
    fi

    # 检查 docker compose
    if ! docker compose version &> /dev/null; then
        log_error "Docker Compose 未安装或版本过低"
        exit 1
    fi

    # 创建 .env 文件（如果不存在）
    if [ ! -f .env ]; then
        log_info "创建 .env 配置文件..."
        cp .env.example .env
        log_warn "请编辑 .env 文件设置生产环境密钥"
        log_warn "  vim .env"
        log_warn "然后重新运行: ./deploy.sh server"
        exit 0
    fi

    # 停止旧容器（如果存在）
    log_info "停止旧容器..."
    docker compose down 2>/dev/null || true

    # 构建并启动
    log_info "构建并启动服务..."
    docker compose up -d --build

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

    # 健康检查
    log_info "执行健康检查..."
    if curl -s http://localhost:8081/health > /dev/null; then
        log_info "服务启动成功!"
        echo ""
        echo "=========================================="
        echo "  API 地址: http://localhost:8081"
        echo "  健康检查: http://localhost:8081/health"
        echo "=========================================="
        echo ""
        log_info "查看日志: docker compose logs -f"
    else
        log_error "健康检查失败，请查看日志: docker compose logs"
        exit 1
    fi
}

# 显示帮助
show_help() {
    echo "Material Texture API 部署脚本"
    echo ""
    echo "用法: ./deploy.sh [命令]"
    echo ""
    echo "命令:"
    echo "  pack    在本地机器打包项目用于传输"
    echo "  server  在服务器上执行部署"
    echo "  logs    查看容器日志"
    echo "  stop    停止服务"
    echo "  restart 重启服务"
    echo "  help    显示此帮助信息"
    echo ""
    echo "部署流程:"
    echo "  1. 本地: ./deploy.sh pack"
    echo "  2. 传输: scp material_texture_deploy.tar.gz user@server:/path/"
    echo "  3. 服务器: tar -xzvf material_texture_deploy.tar.gz"
    echo "  4. 服务器: cd deploy_package && ./deploy.sh server"
}

# 日志
logs() {
    docker compose logs -f
}

# 停止
stop() {
    log_info "停止服务..."
    docker compose down
    log_info "服务已停止"
}

# 重启
restart() {
    log_info "重启服务..."
    docker compose restart
    log_info "服务已重启"
}

# 主入口
case "${1:-help}" in
    pack)
        pack
        ;;
    server)
        server_deploy
        ;;
    logs)
        logs
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    help|*)
        show_help
        ;;
esac
