#!/bin/bash

# 情绪博物馆后端服务部署脚本
# 部署到远程服务器 101.200.208.45

set -e

# 配置变量
APP_NAME="emotion-museum-single"
JAR_NAME="backend-single-1.0.0.jar"
JAR_PATH="./target/${JAR_NAME}"

# 远程服务器配置
REMOTE_HOST="101.200.208.45"
REMOTE_USER="root"
REMOTE_DIR="/data/programs/emotion-museum"
REMOTE_LOG_DIR="/data/logs/emotion-museum"
REMOTE_JAR_NAME="emotion-single-1.0.0.jar"
SPRING_PROFILE="test"

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

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

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

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

# 构建项目
build_project() {
    log_info "开始构建项目..."

    if ! command -v mvn > /dev/null 2>&1; then
        log_error "未找到Maven命令，请确保已安装Maven"
        exit 1
    fi

    log_info "执行: mvn clean package -DskipTests"
    if ! mvn clean package -DskipTests; then
        log_error "项目构建失败"
        exit 1
    fi

    if [ ! -f "$JAR_PATH" ]; then
        log_error "项目构建失败，未找到JAR文件: $JAR_PATH"
        exit 1
    fi

    log_info "✅ 项目构建成功: $JAR_PATH"
    log_info "文件大小: $(ls -lh $JAR_PATH | awk '{print $5}')"
}

# 检查JAR文件
check_jar() {
    if [ ! -f "$JAR_PATH" ]; then
        log_error "JAR文件不存在: $JAR_PATH"
        log_info "请先执行打包命令: mvn clean package"
        exit 1
    fi
    log_info "JAR文件检查通过: $JAR_PATH"
}

# 显示服务状态
show_status() {
    log_info "=== 服务信息 ==="
    log_info "服务器地址: $REMOTE_HOST"
    log_info "部署目录: $REMOTE_DIR"
    log_info "日志目录: $REMOTE_LOG_DIR"
    log_info "Spring Profile: $SPRING_PROFILE"
    
    log_info "检查服务状态..."
    ssh $REMOTE_USER@$REMOTE_HOST "ps aux | grep $REMOTE_JAR_NAME | grep -v grep" || log_info "服务未运行"
}

# 部署到远程服务器
# 参数: $1 - 可选，指定要上传的额外文件
deploy() {
    UPLOAD_SCRIPT="$1"
    
    log_info "开始部署到 $REMOTE_HOST..."

    build_project
    check_jar

    # 创建远程目录
    log_info "创建远程目录..."
    ssh $REMOTE_USER@$REMOTE_HOST "mkdir -p $REMOTE_DIR" || { log_error "创建远程目录失败"; exit 1; }
    ssh $REMOTE_USER@$REMOTE_HOST "mkdir -p $REMOTE_LOG_DIR" || { log_error "创建远程日志目录失败"; exit 1; }

    # 上传JAR文件
    log_info "上传JAR文件到远程服务器..."
    log_info "本地文件: $JAR_PATH"
    log_info "远程路径: $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/$REMOTE_JAR_NAME"

    if ! scp "$JAR_PATH" $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/$REMOTE_JAR_NAME; then
        log_error "上传JAR文件失败"
        exit 1
    fi
    log_info "✅ JAR文件上传成功"

    # 验证远程文件
    log_info "验证远程文件..."
    ssh $REMOTE_USER@$REMOTE_HOST "ls -lh $REMOTE_DIR/$REMOTE_JAR_NAME" || { log_error "远程文件验证失败"; exit 1; }

    # 上传额外文件
    if [ -n "$UPLOAD_SCRIPT" ] && [ -f "$UPLOAD_SCRIPT" ]; then
        log_info "上传文件到远程服务器: $UPLOAD_SCRIPT"
        if ! scp "$UPLOAD_SCRIPT" $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/; then
            log_error "上传文件失败: $UPLOAD_SCRIPT"
            exit 1
        fi
        log_info "✅ 文件上传成功: $UPLOAD_SCRIPT"
        
        REMOTE_FILENAME=$(basename "$UPLOAD_SCRIPT")
        if [[ "$REMOTE_FILENAME" == *.sh ]]; then
            ssh $REMOTE_USER@$REMOTE_HOST "chmod +x $REMOTE_DIR/$REMOTE_FILENAME"
        fi
    fi

    # 执行远程部署
    log_info "在远程服务器上执行部署..."
    if ! ssh $REMOTE_USER@$REMOTE_HOST "cd $REMOTE_DIR && ./deploy-server.sh $SPRING_PROFILE"; then
        log_error "远程部署脚本执行失败"
        exit 1
    fi

    log_info "✅ 部署完成！"
    show_status
}

# 打印使用说明
print_usage() {
    echo "用法: $0 [命令] [参数]"
    echo ""
    echo "命令:"
    echo "  (无参数)            - 部署到远程服务器（默认）"
    echo "  [文件名]            - 部署并上传指定文件（如 deploy-server.sh）"
    echo "  build               - 仅构建项目"
    echo "  status              - 查看远程服务状态"
    echo ""
    echo "示例:"
    echo "  $0                           # 部署到远程服务器"
    echo "  $0 deploy-server.sh          # 同时上传部署脚本"
    echo "  $0 build                     # 仅构建项目"
    echo "  $0 status                    # 查看服务状态"
}

# 主逻辑
case "${1:-}" in
    "")
        deploy
        ;;
    "build")
        build_project
        ;;
    "status")
        show_status
        ;;
    "help"|"-h"|"--help")
        print_usage
        ;;
    *)
        # 如果参数是文件，则上传该文件
        if [ -f "$1" ]; then
            deploy "$1"
        else
            deploy "$1"
        fi
        ;;
esac
