#!/bin/bash

# 部署脚本 - 数字档案管理系统前端

set -e

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

# 配置变量
PROJECT_NAME="digital-archive"
DEPLOY_DIR="${1:-/opt/${PROJECT_NAME}}"  # 第一个参数作为部署目录，默认为/opt/digital-archive
FRONTEND_DIR="${DEPLOY_DIR}/frontend"
BACKUP_DIR="${DEPLOY_DIR}/backup"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

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

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

# 检查Docker和Docker Compose
check_dependencies() {
    log_info "检查依赖..."
    
    if ! command -v docker &> /dev/null; then
        log_error "Docker 未安装或不在PATH中"
        exit 1
    fi
    
    # 检查Docker Compose plugin
    if ! docker compose version &> /dev/null; then
        log_error "Docker Compose plugin 未安装"
        exit 1
    fi
    
    log_info "依赖检查完成"
    log_info "Docker版本: $(docker --version)"
    log_info "Docker Compose版本: $(docker compose version)"
}

# 检查proxy网络是否存在
check_network() {
    log_info "检查proxy网络..."
    
    if ! docker network ls | grep -q "proxy"; then
        log_error "proxy网络不存在，请先创建proxy网络："
        log_error "docker network create proxy"
        exit 1
    fi
    
    log_info "proxy网络检查完成"
}

# 检查后端服务是否运行
check_backend() {
    log_info "检查后端服务..."
    
    if ! docker ps | grep -q "digital-archive-app"; then
        log_warn "后端服务digital-archive-app未运行，请确保后端服务已启动"
    else
        log_info "后端服务运行正常"
    fi
}

# 创建部署目录
create_directories() {
    log_info "创建部署目录..."
    
    sudo mkdir -p "${DEPLOY_DIR}"
    sudo mkdir -p "${FRONTEND_DIR}"
    sudo mkdir -p "${BACKUP_DIR}"
    
    log_info "目录创建完成"
}

# 备份当前版本
backup_current() {
    log_info "备份当前版本..."
    
    if [ -d "${FRONTEND_DIR}" ] && [ "$(ls -A ${FRONTEND_DIR})" ]; then
        sudo mv "${FRONTEND_DIR}" "${BACKUP_DIR}/frontend_${TIMESTAMP}"
        log_info "当前版本已备份到: ${BACKUP_DIR}/frontend_${TIMESTAMP}"
    fi
}

# 复制文件到部署目录
copy_files() {
    log_info "复制文件到部署目录..."
    
    # 创建新的前端目录
    sudo mkdir -p "${FRONTEND_DIR}"
    
    # 复制必要文件
    sudo cp docker-compose.yml "${FRONTEND_DIR}/"
    sudo cp Dockerfile "${FRONTEND_DIR}/"
    sudo cp nginx.conf "${FRONTEND_DIR}/"
    sudo cp .dockerignore "${FRONTEND_DIR}/"
    sudo cp -r src "${FRONTEND_DIR}/"
    sudo cp package*.json "${FRONTEND_DIR}/"
    sudo cp vue.config.js "${FRONTEND_DIR}/"
    sudo cp babel.config.js "${FRONTEND_DIR}/"
    sudo cp jsconfig.json "${FRONTEND_DIR}/"
    
    # 设置权限
    sudo chown -R $USER:$USER "${FRONTEND_DIR}"
    
    log_info "文件复制完成"
}

# 构建和启动服务
build_and_start() {
    log_info "构建和启动前端服务..."
    
    cd "${FRONTEND_DIR}"
    
    # 停止现有服务
    docker compose down || true
    
    # 构建镜像
    docker compose build --no-cache
    
    # 启动服务
    docker compose up -d
    
    log_info "前端服务启动完成"
}

# 验证部署
verify_deployment() {
    log_info "验证部署..."
    
    # 等待服务启动
    sleep 10
    
    # 检查容器状态
    if docker compose ps | grep -q "Up"; then
        log_info "前端服务运行正常"
    else
        log_error "前端服务启动失败"
        docker compose logs
        exit 1
    fi
    
    # 健康检查
    log_info "执行健康检查..."
    if curl -f http://localhost/health > /dev/null 2>&1; then
        log_info "健康检查通过"
    else
        log_warn "健康检查失败，但服务可能仍在启动中"
    fi
}

# 清理旧镜像
cleanup() {
    log_info "清理旧镜像..."
    
    # 删除悬空镜像
    docker image prune -f
    
    # 删除旧版本镜像（保留最近3个版本）
    OLD_IMAGES=$(docker images digital-archive-frontend --format "table {{.Repository}}:{{.Tag}}" | tail -n +2 | tail -n +4)
    if [ ! -z "$OLD_IMAGES" ]; then
        echo "$OLD_IMAGES" | xargs docker rmi -f || true
    fi
    
    log_info "清理完成"
}

# 显示部署信息
show_info() {
    log_info "部署完成！"
    echo ""
    echo "部署信息："
    echo "  部署目录: ${FRONTEND_DIR}"
    echo "  访问地址: http://localhost"
    echo "  容器名称: digital-archive-frontend"
    echo "  备份位置: ${BACKUP_DIR}"
    echo ""
    echo "常用命令："
    echo "  查看日志: cd ${FRONTEND_DIR} && docker compose logs -f"
    echo "  重启服务: cd ${FRONTEND_DIR} && docker compose restart"
    echo "  停止服务: cd ${FRONTEND_DIR} && docker compose down"
    echo ""
}

# 显示使用帮助
show_help() {
    echo "用法: $0 [部署目录]"
    echo ""
    echo "参数:"
    echo "  部署目录    指定部署目录路径（可选，默认为/opt/digital-archive）"
    echo ""
    echo "示例:"
    echo "  $0                    # 使用默认目录 /opt/digital-archive"
    echo "  $0 /root/xxx          # 使用指定目录 /root/xxx"
    echo "  $0 ./deploy           # 使用当前目录下的deploy子目录"
    echo ""
}

# 主函数
main() {
    # 检查帮助参数
    if [[ "$1" == "-h" || "$1" == "--help" ]]; then
        show_help
        exit 0
    fi
    
    log_info "开始部署数字档案管理系统前端..."
    log_info "部署目录: ${DEPLOY_DIR}"
    
    check_dependencies
    check_network
    check_backend
    create_directories
    backup_current
    copy_files
    build_and_start
    verify_deployment
    cleanup
    show_info
    
    log_info "部署完成！"
}

# 执行主函数
main "$@"