#!/bin/bash

# ============================================
# 海外预约系统 - 自动部署脚本
# ============================================

set -e  # 遇到错误立即退出

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

# 项目根目录
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"

# 检测 docker compose 命令
if docker compose version > /dev/null 2>&1; then
    DOCKER_COMPOSE="docker compose"
elif docker-compose version > /dev/null 2>&1; then
    DOCKER_COMPOSE="docker-compose"
else
    echo -e "${RED}错误: 未找到 docker compose 命令${NC}"
    exit 1
fi

echo -e "${BLUE}============================================${NC}"
echo -e "${BLUE}   海外预约系统 - 自动部署脚本${NC}"
echo -e "${BLUE}============================================${NC}"
echo ""

# 检查 Docker 是否运行
check_docker() {
    echo -e "${YELLOW}[1/5] 检查 Docker 环境...${NC}"
    if ! docker info > /dev/null 2>&1; then
        echo -e "${RED}错误: Docker 未运行，请先启动 Docker${NC}"
        exit 1
    fi
    echo -e "${GREEN}✓ Docker 运行正常 (使用 $DOCKER_COMPOSE)${NC}"
}

# 检查环境变量文件
check_env() {
    echo -e "${YELLOW}[2/5] 检查环境配置...${NC}"
    if [ ! -f "$SCRIPT_DIR/.env" ]; then
        echo -e "${YELLOW}  .env 文件不存在，从模板创建...${NC}"
        cp "$SCRIPT_DIR/.env.example" "$SCRIPT_DIR/.env"
        echo -e "${YELLOW}  请编辑 $SCRIPT_DIR/.env 配置数据库等信息${NC}"
        echo -e "${RED}  首次部署请先配置 .env 文件后重新运行脚本${NC}"
        exit 1
    fi
    echo -e "${GREEN}✓ 环境配置已就绪${NC}"
}

# 构建 Admin 前端
build_admin() {
    echo -e "${YELLOW}[3/5] 构建 Admin 前端...${NC}"
    cd "$PROJECT_ROOT/admin"

    # 检查 node_modules
    if [ ! -d "node_modules" ]; then
        echo -e "${YELLOW}  安装依赖...${NC}"
        npm install
    fi

    echo -e "${YELLOW}  执行构建...${NC}"
    npm run build

    # 复制构建产物
    echo -e "${YELLOW}  复制构建产物到 server/admin-dist...${NC}"
    rm -rf "$SCRIPT_DIR/admin-dist"
    cp -r dist "$SCRIPT_DIR/admin-dist"

    echo -e "${GREEN}✓ Admin 构建完成${NC}"
}

# 构建并启动 Docker 服务
deploy_docker() {
    echo -e "${YELLOW}[4/5] 构建并启动 Docker 服务...${NC}"
    cd "$SCRIPT_DIR"

    # 停止旧容器（如果存在）
    echo -e "${YELLOW}  停止旧容器...${NC}"
    $DOCKER_COMPOSE down 2>/dev/null || true

    # 构建并启动
    echo -e "${YELLOW}  构建镜像并启动容器...${NC}"
    $DOCKER_COMPOSE up -d --build

    echo -e "${GREEN}✓ Docker 服务已启动${NC}"
}

# 检查服务状态
check_status() {
    echo -e "${YELLOW}[5/5] 检查服务状态...${NC}"
    sleep 3

    # 检查容器状态
    echo ""
    $DOCKER_COMPOSE ps
    echo ""

    # 等待服务就绪
    echo -e "${YELLOW}  等待服务就绪...${NC}"
    for i in {1..30}; do
        if curl -s http://localhost:2701/health > /dev/null 2>&1; then
            echo -e "${GREEN}✓ 服务已就绪${NC}"
            break
        fi
        if [ $i -eq 30 ]; then
            echo -e "${YELLOW}  服务启动中，请稍后检查...${NC}"
        fi
        sleep 1
    done
}

# 显示访问信息
show_info() {
    echo ""
    echo -e "${GREEN}============================================${NC}"
    echo -e "${GREEN}   部署完成！${NC}"
    echo -e "${GREEN}============================================${NC}"
    echo ""
    echo -e "  访问地址:"
    echo -e "    Admin 后台:  ${BLUE}http://localhost:2701/admin${NC}"
    echo -e "    API 接口:    ${BLUE}http://localhost:2701/api/v1${NC}"
    echo -e "    健康检查:    ${BLUE}http://localhost:2701/health${NC}"
    echo ""
    echo -e "  常用命令:"
    echo -e "    查看日志:    ${YELLOW}cd server && $DOCKER_COMPOSE logs -f${NC}"
    echo -e "    停止服务:    ${YELLOW}cd server && $DOCKER_COMPOSE down${NC}"
    echo -e "    重启服务:    ${YELLOW}cd server && $DOCKER_COMPOSE restart${NC}"
    echo ""
}

# 主流程
main() {
    check_docker
    check_env
    build_admin
    deploy_docker
    check_status
    show_info
}

# 处理命令行参数
case "${1:-}" in
    --skip-build)
        echo -e "${YELLOW}跳过 Admin 构建${NC}"
        check_docker
        check_env
        deploy_docker
        check_status
        show_info
        ;;
    --restart)
        echo -e "${YELLOW}重启服务${NC}"
        cd "$SCRIPT_DIR"
        $DOCKER_COMPOSE restart
        check_status
        ;;
    --stop)
        echo -e "${YELLOW}停止服务${NC}"
        cd "$SCRIPT_DIR"
        $DOCKER_COMPOSE down
        echo -e "${GREEN}✓ 服务已停止${NC}"
        ;;
    --logs)
        cd "$SCRIPT_DIR"
        $DOCKER_COMPOSE logs -f
        ;;
    --help)
        echo "用法: ./deploy.sh [选项]"
        echo ""
        echo "选项:"
        echo "  (无参数)      完整部署（构建 Admin + 启动服务）"
        echo "  --skip-build  跳过 Admin 构建，直接部署"
        echo "  --restart     重启服务"
        echo "  --stop        停止服务"
        echo "  --logs        查看日志"
        echo "  --help        显示帮助"
        ;;
    *)
        main
        ;;
esac
