#!/bin/bash

# =============================================
# Vue前端应用自动部署脚本
# 功能：备份当前部署文件，部署新版本到nginx
# =============================================

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

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

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

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

# 定义目录变量
put_tmp_directory="/home/lq/lq_workspace/deploy_workspace/put"           # 部署临时目录（存放新版本的dist-dev.zip）
nginx_html_directory="/home/lq/nginx/html"  # nginx部署目录
nginx_html_bak="/home/lq/lq_workspace/deploy_workspace/deploy_bak/LQAdminFrontServer"           # 备份目录


# 处理参数
if [ $# -eq 0 ]; then
    # 如果没有传入参数，使用默认文件名
    SOURCE_ZIP="$put_tmp_directory/dist-dev.zip"
    log_info "未指定部署文件，将使用默认文件: $SOURCE_ZIP"

    # 检查默认文件是否存在
    if [ ! -f "$SOURCE_ZIP" ]; then
        log_error "默认文件 $SOURCE_ZIP 不存在于当前目录"
        echo "当前目录: $(pwd)"
        echo "请指定要部署的zip文件路径，或者将dist-dev.zip放在当前目录"
        echo ""
        echo "使用方法:"
        echo "  1. 不传参数: $0                    (使用当前目录的dist-dev.zip)"
        echo "  2. 传入参数: $0 <zip文件路径>       (使用指定路径的zip文件)"
        echo ""
        echo "示例:"
        echo "  $0                              # 使用当前目录的dist-dev.zip"
        echo "  $0 /home/user/dist-dev.zip      # 使用指定路径的文件"
        echo "  $0 /home/user/vue-app.zip       # 使用其他名称的zip文件"
        exit 1
    fi
else
    # 使用传入的参数
    SOURCE_ZIP="$put_tmp_directory/$1"
    log_info "使用指定的部署文件: $SOURCE_ZIP"
fi




# 检查源文件是否存在
if [ ! -f "$SOURCE_ZIP" ]; then
    log_error "文件不存在: $SOURCE_ZIP"
    exit 1
fi

# 检查文件是否是zip格式
if ! file "$SOURCE_ZIP" | grep -q "Zip archive"; then
    log_error "文件不是有效的zip压缩包: $SOURCE_ZIP"
    exit 1
fi

# 检查目录是否存在，不存在则创建
check_and_create_dir() {
    if [ ! -d "$1" ]; then
        log_warn "目录不存在，正在创建: $1"
        mkdir -p "$1"
        if [ $? -eq 0 ]; then
            log_info "目录创建成功: $1"
        else
            log_error "目录创建失败: $1"
            exit 1
        fi
    fi
}

# 检查并创建所有需要的目录
log_info "检查并创建目录..."
check_and_create_dir "$put_tmp_directory"
check_and_create_dir "$nginx_html_bak"
check_and_create_dir "$nginx_html_directory"

# 清理临时目录中的旧文件
#log_info "清理临时目录..."
#rm -f "$put_tmp_directory"/*.zip 2>/dev/null

# 检查nginx部署目录是否为空
if [ ! -d "$nginx_html_directory" ] || [ -z "$(ls -A $nginx_html_directory 2>/dev/null)" ]; then
    log_warn "nginx部署目录为空或不存在，跳过备份步骤"
    SKIP_BACKUP=true
else
    SKIP_BACKUP=false
fi

# 获取当前时间（用于备份文件名）
current_time=$(date "+%Y-%m-%d_%H-%M-%S")
backup_filename="dist-dev_bak_${current_time}.zip"
backup_filepath="/tmp/${backup_filename}"

# ========== 2.1 备份当前部署文件 ==========
if [ "$SKIP_BACKUP" = false ]; then
    log_info "正在备份当前部署文件..."
    
    # 切换到nginx部署目录
    cd "$nginx_html_directory" || {
        log_error "无法切换到nginx部署目录: $nginx_html_directory"
        exit 1
    }
    
    # 检查是否有需要备份的文件
    if [ ! -f "index.html" ] && [ ! -d "assets" ]; then
        log_warn "未找到index.html和assets目录，跳过备份"
        SKIP_BACKUP=true
    else
        # 创建备份压缩包
        log_info "正在创建备份文件: $backup_filename"
        if command -v zip >/dev/null 2>&1; then
            # 只备份index.html和assets目录
            if [ -f "index.html" ]; then
                zip -qr "$backup_filepath" index.html
                log_info "已备份 index.html"
            fi
            
            if [ -d "assets" ]; then
                zip -qru "$backup_filepath" assets
                log_info "已备份 assets 目录"
            fi
            
            if [ ! -f "$backup_filepath" ]; then
                log_error "备份文件创建失败"
                exit 1
            fi
            
            backup_size=$(du -h "$backup_filepath" | cut -f1)
            log_info "备份完成，文件大小: $backup_size"
        else
            log_error "未找到zip命令，请先安装zip工具"
            log_info "安装命令: sudo apt-get install zip 或 sudo yum install zip"
            exit 1
        fi
    fi
fi

# ========== 2.2 复制备份文件到备份目录 ==========
if [ "$SKIP_BACKUP" = false ] && [ -f "$backup_filepath" ]; then
    log_info "正在复制备份文件到备份目录..."
    cp "$backup_filepath" "$nginx_html_bak/"
    if [ $? -eq 0 ]; then
        log_info "备份文件已保存到: $nginx_html_bak/$backup_filename"
    else
        log_error "备份文件复制失败"
        exit 1
    fi
fi

# ========== 2.3 删除工作目录下的备份文件 ==========
if [ -f "$backup_filepath" ]; then
    log_info "清理临时备份文件..."
    rm -f "$backup_filepath"
    log_info "临时备份文件已清理"
fi

# ========== 2.4 复制新的dist-dev.zip到nginx部署目录 ==========
log_info "正在复制新版本文件到nginx部署目录..."
cp "$SOURCE_ZIP" "$nginx_html_directory/dist-dev.zip"

if [ $? -ne 0 ]; then
    log_error "文件复制失败"
    exit 1
fi

log_info "新版本文件已复制到: $nginx_html_directory/dist-dev.zip"

# ========== 2.5 解压缩并清理 ==========
log_info "正在解压缩新版本文件..."

# 切换到nginx部署目录
cd "$nginx_html_directory" || {
    log_error "无法切换到nginx部署目录"
    exit 1
}

# 先删除现有的文件 再解压
rm -f index.html && rm -rf assets
log_info "删除nginx工作目录的文件"

# 检查unzip命令
if ! command -v unzip >/dev/null 2>&1; then
    log_error "未找到unzip命令，请先安装unzip工具"
    log_info "安装命令: sudo apt-get install unzip 或 sudo yum install unzip"
    exit 1
fi

# 解压缩前备份现有文件（如果需要）
if [ "$SKIP_BACKUP" = false ]; then
    # 移动现有文件到临时目录
    temp_backup_dir="/tmp/nginx_html_backup_${current_time}"
    mkdir -p "$temp_backup_dir"
    
    # 移动除dist-dev.zip之外的所有文件
    for item in *; do
        if [ "$item" != "dist-dev.zip" ]; then
            mv "$item" "$temp_backup_dir/" 2>/dev/null || true
        fi
    done
    log_info "现有文件已临时备份到: $temp_backup_dir"
fi

# 解压缩文件
log_info "正在解压dist-dev.zip..."
unzip -o -q "dist-dev.zip"

if [ $? -eq 0 ]; then
    log_info "解压缩完成"
    
    # 检查解压后的文件
    if [ -f "index.html" ]; then
        log_info "✓ index.html 文件存在"
    else
        log_warn "⚠ 解压后未找到index.html文件"
    fi
    
    if [ -d "assets" ]; then
        assets_count=$(find assets -type f | wc -l)
        log_info "✓ assets 目录存在，包含 $assets_count 个文件"
    else
        log_warn "⚠ 解压后未找到assets目录"
    fi
else
    log_error "解压缩失败"
    
    # 如果解压失败，恢复备份的文件
    if [ "$SKIP_BACKUP" = false ] && [ -d "$temp_backup_dir" ]; then
        log_info "正在恢复备份文件..."
        mv "$temp_backup_dir"/* . 2>/dev/null || true
    fi
    exit 1
fi

# ========== 清理临时文件和目录 ==========
log_info "正在清理临时文件..."

# 删除zip文件
rm -f "$nginx_html_directory/dist-dev.zip"
log_info "已删除dist-dev.zip文件"

# 删除临时备份目录
if [ -d "$temp_backup_dir" ]; then
    rm -rf "$temp_backup_dir"
    log_info "已清理临时备份目录"
fi

# 设置正确的权限
log_info "设置文件权限..."
chmod -R 755 "$nginx_html_directory" 2>/dev/null || true

# 验证部署
log_info "==================== 部署验证 ===================="
log_info "部署目录: $nginx_html_directory"
log_info "备份目录: $nginx_html_bak"
log_info "部署时间: $(date)"
log_info "备份文件: ${backup_filename:-无}"

# 显示目录结构
log_info "当前部署文件结构:"
ls -la "$nginx_html_directory" | head -20

log_info "=================================================="

# 获取文件数量统计
html_count=$(find "$nginx_html_directory" -name "*.html" -type f | wc -l)
js_count=$(find "$nginx_html_directory" -name "*.js" -type f | wc -l)
css_count=$(find "$nginx_html_directory" -name "*.css" -type f | wc -l)

log_info "部署统计:"
log_info "  HTML文件: $html_count 个"
log_info "  JS文件: $js_count 个"
log_info "  CSS文件: $css_count 个"

if [ "$SKIP_BACKUP" = false ]; then
    log_info "  🔄 备份已创建: $nginx_html_bak/$backup_filename"
fi

log_info "${GREEN}✅ Vue前端应用部署完成！${NC}"

# 输出nginx重启建议
log_info "=================================================="
log_info "如果需要重新加载nginx配置，请执行以下命令:"
echo "sudo nginx -s reload"
log_info "=================================================="
