#!/bin/bash

# 定义IP列表
declare -a ips=("192.168.20.206" "192.168.20.205" "192.168.20.204" "192.168.20.203")

# 获取脚本所在目录的绝对路径
SCRIPT_DIR=$(cd "$(dirname -- "$0")" || exit; pwd -P)
LOCAL_TEMP_DIR="$SCRIPT_DIR/temp"
# 远程部署目录
REMOTE_DEPLOY_DIR="/data/deploy"
REMOTE_TEMP_DIR="$REMOTE_DEPLOY_DIR/temp"

# 全局变量
JAR_MD5=""

# 远程用户名变量，便于后续修改
REMOTE_USER="aiot"

# 检查并生成SSH密钥
setup_ssh_key() {
    if [ ! -f "$HOME/.ssh/id_rsa" ]; then
        echo "正在生成SSH密钥 ($HOME/.ssh/id_rsa)..."
        ssh-keygen -t rsa -N "" -f "$HOME/.ssh/id_rsa"
        echo "SSH密钥生成完成"
    else
        echo "已存在SSH密钥，跳过生成步骤"
    fi
}

# 获取当前IP并从列表中移除
filter_current_ip() {
    local current_ip=""
    while read -r ip; do
        for valid_ip in "${ips[@]}"; do
            if [ "$ip" = "$valid_ip" ]; then
                current_ip="$ip"
                break 2
            fi
        done
    done < <(ip addr | grep -oP '192\.168\.20\.\d+')

    if [ -z "$current_ip" ]; then
        echo "错误: 未找到匹配的IP地址"
        exit 1
    fi

    echo "本机IP: $current_ip"

    # 从列表中移除当前IP
    local found=false
    for i in "${!ips[@]}"; do
        if [ "${ips[$i]}" = "$current_ip" ]; then
            found=true
            unset 'ips[$i]'
            break
        fi
    done

    if [ "$found" = false ]; then
        echo "错误: 当前IP $current_ip 不在指定的IP列表中"
        exit 1
    fi

    # 重新整理数组
    ips=("${ips[@]}")
}

# 加载环境变量
load_env() {
    if [ ! -f "$SCRIPT_DIR/.env" ]; then
        echo "错误: .env文件不存在"
        exit 1
    fi
    # shellcheck disable=SC1091
    source "$SCRIPT_DIR/.env"
}

# 检查JAR包并获取MD5
check_jar() {
    if [ ! -f "$LOCAL_TEMP_DIR/$JAR_NAME" ]; then
        echo "错误: $LOCAL_TEMP_DIR/$JAR_NAME 不存在"
        exit 1
    fi
    
    JAR_MD5="$(md5sum "$LOCAL_TEMP_DIR/$JAR_NAME" | cut -d' ' -f1)"
    echo "----------------------------------------"
    echo "准备传输的JAR包: $JAR_NAME"
    echo "本地JAR包MD5值: $JAR_MD5"
    echo "----------------------------------------"
    
    read -r -p "确认继续传输? (y/n): " confirm
    if [[ $confirm != [yY] ]]; then
        echo "用户取消操作"
        exit 0
    fi
}

# 配置单个服务器的SSH密钥
setup_server_ssh() {
    local ip=$1
    if ! ssh -o BatchMode=yes -o ConnectTimeout=5 "$REMOTE_USER@$ip" exit 2>/dev/null; then
        echo "正在配置 $ip 的SSH密钥访问权限..."
        if ssh-copy-id -f "$REMOTE_USER@$ip" 2>/dev/null; then
            echo "成功配置 $ip 的SSH密钥"
        fi
        return $?
    fi
    return 0
}

# 部署到单个服务器
deploy_to_server() {
    local ip=$1
    
    echo "正在传输文件到 $ip..."
    
    # 配置SSH密钥
    if ! setup_server_ssh "$ip"; then
        echo "警告: 无法配置 $ip 的SSH密钥，跳过此服务器"
        return 2
    fi
    
    # 检查远程目录是否存在
    if ! ssh "$REMOTE_USER@$ip" "[ -d \$REMOTE_TEMP_DIR ]"; then
        echo "警告: $ip 上的目录 $REMOTE_TEMP_DIR 不存在"
        return 2
    fi
    
    # 传输文件
    if ! scp "$LOCAL_TEMP_DIR/$JAR_NAME" "$REMOTE_USER@$ip:$REMOTE_TEMP_DIR/$JAR_NAME" 2>&1; then
        echo "警告: 传输到 $ip 的 $REMOTE_TEMP_DIR 失败"
        return 2
    fi
    echo "成功传输到 $ip"
    
    # 如果不需要部署，返回0表示传输成功
    if [ "$DEPLOY_FLAG" != "1" ]; then
        return 0
    fi
    
    # 部署流程
    local remote_md5
    remote_md5=$(ssh "$REMOTE_USER@$ip" "md5sum \"$REMOTE_TEMP_DIR/$JAR_NAME\"" | cut -d' ' -f1)

    if [ "$remote_md5" = "$JAR_MD5" ]; then
        echo "MD5校验成功，开始在 $ip 上执行部署..."
        if ! ssh "$REMOTE_USER@$ip" "cd $REMOTE_DEPLOY_DIR && bash ./plugin-deploy.sh $BUILD_FLAG"; then
            echo "警告: 在 $ip 上执行部署失败"
            return 1
        fi
        echo "在 $ip 上部署成功"
        return 0
    else
        echo "警告: $ip 上的文件MD5校验失败"
        echo "远程MD5: $remote_md5"
        echo "本地MD5: $JAR_MD5"
        return 1
    fi
}

# 主函数
main() {
    # 获取部署参数
    DEPLOY_FLAG=${1:-0}
    BUILD_FLAG=${2:-0}
    echo "部署参数: $DEPLOY_FLAG"
    echo "构建参数: $BUILD_FLAG"

    # 初始化设置
    setup_ssh_key
    filter_current_ip
    load_env
    check_jar

    # 部署本地的服务的数量
    local deploy_local_count=0
    # 推送到所有服务器
    local transfer_success=0
    local deploy_success=0
    local total_servers=${#ips[@]}

    for ip in "${ips[@]}"; do
        echo "----------------------------------------"
        deploy_to_server "$ip"
        local status=$?
        if [ $status -eq 0 ]; then
            ((transfer_success++))
            [ "$DEPLOY_FLAG" = "1" ] && ((deploy_success++))
        elif [ $status -eq 1 ]; then
            # 传输成功但部署失败
            ((transfer_success++))
        fi
        echo "----------------------------------------"
    done

    # 本机部署 - 确保远程传输完成后再执行
    if [ "$DEPLOY_FLAG" = "1" ]; then
        read -r -p "是否需要本机部署? (y/n): " confirm
        if [[ $confirm = [yY] ]]; then
            deploy_local_count=1
            echo "正在本机部署..."
            if bash "$SCRIPT_DIR/plugin-deploy.sh" "$BUILD_FLAG"; then
                echo "本机部署成功"
                ((deploy_success++))
            else
                echo "本机部署失败"
            fi
        fi
    fi

    echo "----------------------------------------"
    echo "推送脚本执行完成"
    echo "文件传输: $transfer_success/$total_servers 成功"
    [ "$DEPLOY_FLAG" = "1" ] && echo "服务部署: $deploy_success/$((total_servers+deploy_local_count)) 成功"
    echo "----------------------------------------"
}

# 执行主函数
main "$@"