#!/bin/bash

# 一键部署脚本 - Laravel知识库系统
# 整合镜像导出、压缩、传输和部署功能

set -e

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"

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

log() {
    echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] ✓${NC} $1"
}

log_error() {
    echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] ✗${NC} $1"
}

show_help() {
    cat << EOF
一键部署脚本 - Laravel知识库系统

用法: $0 [模式] [选项]

模式:
    export      导出Docker镜像
    deploy      部署到OpenEuler服务器
    full        完整流程 (导出+部署)

选项:
    -h, --help              显示帮助信息
    -c, --compress          启用压缩
    -v, --verify            验证完整性
    --server HOST           目标服务器地址
    --user USER             SSH用户名
    --deploy-dir DIR        部署目录

示例:
    $0 export -c -v                    # 导出并压缩镜像
    $0 deploy --server 192.168.1.100   # 部署到服务器
    $0 full -c --server 192.168.1.100  # 完整流程

EOF
}

# 默认配置
MODE=""
COMPRESS=false
VERIFY=false
SERVER=""
USER="deploy"
DEPLOY_DIR="/opt/knowledge-base"

# 解析参数
while [[ $# -gt 0 ]]; do
    case $1 in
        export|deploy|full)
            MODE="$1"
            shift
            ;;
        -h|--help)
            show_help
            exit 0
            ;;
        -c|--compress)
            COMPRESS=true
            shift
            ;;
        -v|--verify)
            VERIFY=true
            shift
            ;;
        --server)
            SERVER="$2"
            shift 2
            ;;
        --user)
            USER="$2"
            shift 2
            ;;
        --deploy-dir)
            DEPLOY_DIR="$2"
            shift 2
            ;;
        *)
            log_error "未知参数: $1"
            show_help
            exit 1
            ;;
    esac
done

if [[ -z "$MODE" ]]; then
    log_error "请指定模式: export, deploy, 或 full"
    show_help
    exit 1
fi

# 导出镜像
export_images() {
    log "开始导出Docker镜像..."
    
    local export_args=""
    if [[ "$COMPRESS" == true ]]; then
        export_args="$export_args -c"
    fi
    if [[ "$VERIFY" == true ]]; then
        export_args="$export_args -v"
    fi
    
    if "$SCRIPT_DIR/export-images.sh" $export_args; then
        log_success "镜像导出完成"
    else
        log_error "镜像导出失败"
        exit 1
    fi
}

# 部署到服务器
deploy_to_server() {
    if [[ -z "$SERVER" ]]; then
        log_error "请指定服务器地址 --server"
        exit 1
    fi
    
    log "开始部署到服务器: $SERVER"
    
    # 传输文件
    log "传输部署文件..."
    scp -r "${PROJECT_ROOT}/docker-images" "${USER}@${SERVER}:/tmp/"
    scp "${SCRIPT_DIR}/deploy-to-openeuler.sh" "${USER}@${SERVER}:/tmp/"
    
    # 远程部署
    log "执行远程部署..."
    ssh "${USER}@${SERVER}" "sudo /tmp/deploy-to-openeuler.sh -d $DEPLOY_DIR /tmp/docker-images"
    
    log_success "部署完成"
}

# 主流程
case "$MODE" in
    export)
        export_images
        ;;
    deploy)
        deploy_to_server
        ;;
    full)
        export_images
        deploy_to_server
        ;;
esac

log_success "操作完成！"