#!/bin/bash

# 各服务对应的远程服务器配置 公司本地
declare -A SERVER_CONFIG=(
    # 服务名:IP地址
    ["fs-live-app"]="129.28.193.135"
)

# 通用配置（所有服务器相同）
REMOTE_USER="root"
REMOTE_BASE_DIR="/home/software"

# 本地 JAR 包路径
LOCAL_FS_LIVE_SOCKET_JAR="./fs-live-app/target/fs-live-app.jar"

# 函数：检查本地文件是否存在
check_local_file() {
    if [ ! -f "$1" ]; then
        echo "错误: 本地文件 $1 不存在。"
        exit 1
    fi
}

# 停止远程服务器上可能正在运行的旧版本
stop_remote_app() {
    local remote_user=$1
    local remote_host=$2
    local app_name=$3

    echo "正在停止 $remote_host 上的 $app_name 服务..."
    ssh "$remote_user@$remote_host" "pkill -f $app_name || echo '没有找到运行中的进程'"
}

# 检查服务器连通性
check_server_connectivity() {
    local remote_user=$1
    local remote_host=$2

    if ! ssh -o ConnectTimeout=5 "$remote_user@$remote_host" "echo '连接成功'" &>/dev/null; then
        echo "错误: 无法连接到服务器 $remote_host"
        return 1
    fi
    return 0
}

# 部署单个 JAR 包到指定服务器
deploy_jar() {
    local local_jar=$1
    local service_name=$2  # 服务名，用于确定目标服务器
    local remote_dir=$3     # 远程目录名

    # 获取服务对应的服务器IP
    local remote_host="${SERVER_CONFIG[$service_name]}"
    if [ -z "$remote_host" ]; then
        echo "错误: 未找到服务 $service_name 的服务器配置"
        return 1
    fi

    local app_name=$(basename "$local_jar" .jar)

    echo "========================================"
    echo "开始部署 $service_name 到服务器 $remote_host"
    echo "本地文件: $local_jar"
    echo "远程目录: $REMOTE_BASE_DIR/$remote_dir"
    echo "========================================"

    # 检查本地文件
    check_local_file "$local_jar"

    # 检查服务器连通性
    if ! check_server_connectivity "$REMOTE_USER" "$remote_host"; then
        return 1
    fi

    # 创建远程目录（如果不存在）
    echo "创建远程目录..."
    ssh "$REMOTE_USER@$remote_host" "mkdir -p $REMOTE_BASE_DIR/$remote_dir"

    # 停止旧版本
    stop_remote_app "$REMOTE_USER" "$remote_host" "$app_name"

    # 上传 JAR 包
    echo "上传 JAR 包..."
    scp "$local_jar" "$REMOTE_USER@$remote_host:$REMOTE_BASE_DIR/$remote_dir/"

    # 在后台启动 JAR 包
    echo "启动服务..."
    ssh -f "$REMOTE_USER@$remote_host" \
    "cd $REMOTE_BASE_DIR/$remote_dir && \
     nohup java -jar -Xms1g -Xmx2g -XX:+UseG1GC -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 $app_name.jar --spring.profiles.active=druid-ylrz --server.port=7114  \
     >> $app_name.log 2>&1 &"

    # 检查进程是否启动成功
    if ssh "$REMOTE_USER@$remote_host" "pgrep -f $app_name" &>/dev/null; then
        echo "✓ $service_name 部署成功到 $remote_host"
    else
        echo "✗ $service_name 启动失败，请检查日志: $REMOTE_BASE_DIR/$remote_dir/$app_name.log"
        return 1
    fi

    echo ""
}

# 主要部署流程
echo "开始多服务器分布式部署..."
echo "部署配置:"
for service in "${!SERVER_CONFIG[@]}"; do
    echo "  $service -> ${SERVER_CONFIG[$service]}"
done
echo ""

# 部署 fs-live-app
deploy_jar "$LOCAL_FS_LIVE_SOCKET_JAR" "fs-live-app" "fs-live-app"

# 部署 fs-sync (注意：这里使用了不同的JAR命名方式)
#deploy_jar "$LOCAL_FS_SYNC_APP_JAR" "fs-sync" "fs-sync"

echo "========================================"
echo "分布式部署完成!"
echo "各服务部署状态:"
for service in "${!SERVER_CONFIG[@]}"; do
    remote_host="${SERVER_CONFIG[$service]}"
    echo "  $service -> $remote_host"
done
echo "========================================"

# 可选：显示各服务进程状态
#echo "服务进程状态检查:"
#for service in "${!SERVER_CONFIG[@]}"; do
#    remote_host="${SERVER_CONFIG[$service]}"
#    app_name="$service"  # 简化处理，实际可能需要根据JAR文件名调整
#    if ssh "$REMOTE_USER@$remote_host" "pgrep -f $app_name" &>/dev/null; then
#        echo "  ✓ $service 在 $remote_host 上运行正常"
#    else
#        echo "  ✗ $service 在 $remote_host 上未运行"
#    fi
#done

# 251105 0953
