#!/bin/bash

# 设置脚本所在路径
set -e
# set -x
scriptPath=$(cd "$(dirname "$0")" && pwd)

# 初始化变量
REMOTE_URL=""
ProjectArray=()
CONFIG_FILE="$scriptPath/config.sh"  # 默认配置文件路径

# 显示帮助信息
show_help() {
    echo "用法: $(basename "$0") [选项]... [项目名称]..."
    echo ""
    echo "选项:"
    echo "  -u, --url URL      指定远程同步地址"
    echo "  -f, --file FILE    指定配置文件路径（默认: $scriptPath/config.sh）"
    echo "  -h, --help         显示此帮助信息并退出"
    echo ""
    echo "示例:"
    echo "  ./$(basename "$0") --url http://vclusters.imwork.net:6011/nxvideo_upgrade nxvideo_x86_64_2.1.2"
    echo "  ./$(basename "$0") --file ./myconfig.sh"
    echo ""
    echo "如果存在配置文件，会优先从该文件读取 REMOTE_URL 和 ProjectArray。"
    exit 0
}

# 解析命令行参数
while true; do
    case "$1" in
        -u | --url)
            if [ -n "$2" ]; then
                REMOTE_URL="$2"
                shift 2
            else
                echo "❌ 错误：--url 需要一个参数"
                show_help
            fi
            ;;
        -f | --file)
            if [ -n "$2" ]; then
                CONFIG_FILE="$2"
                shift 2
            else
                echo "❌ 错误：--file 需要一个参数"
                show_help
            fi
            ;;
        -h | --help)
            show_help
            ;;
        "")
            break
            ;;
        *)
            # 所有其他参数都加入数组
            ProjectArray+=("$1")
            shift
            ;;
    esac
done

# 尝试加载配置文件
if [ -f "$CONFIG_FILE" ]; then
    echo "使用的配置文件(CONFIG_FILE) = $CONFIG_FILE"
    if ! source "$CONFIG_FILE"; then
        echo "❌ 加载配置文件 '$CONFIG_FILE' 失败，请检查语法"
        exit 1
    fi
fi

# 检查 REMOTE_URL 是否为空
if [ -z "$REMOTE_URL" ]; then
    echo "❌ 错误：REMOTE_URL 未定义或为空，请使用 -u 或 --url 参数指定远程同步地址"
    show_help
fi

# 最终确认 ProjectArray 有值
if [ "${#ProjectArray[@]}" -eq 0 ]; then
    echo "❌ ProjectArray 未定义或为空，请检查 config.sh 或传入项目名称"
    show_help
fi

# 输出调试信息
echo "远程同步地址(REMOTE_URL) = $REMOTE_URL"
echo "项目目录(ProjectArray) = ${ProjectArray[@]}"


for project in "${ProjectArray[@]}"; do
    TARGET_DIR="$scriptPath/$project"
    CHECKSUM_FILENAME="checksum.md5"
    REMOTE_CHECKSUM_URL="$REMOTE_URL/$project/$CHECKSUM_FILENAME"

    mkdir -p "$TARGET_DIR"
    cd "$TARGET_DIR"

    # 下载 checksum.md5
    echo "🌐 正在下载校验文件: $REMOTE_CHECKSUM_URL"
    wget -q -O "$CHECKSUM_FILENAME" "$REMOTE_CHECKSUM_URL"
    if [ $? -ne 0 ]; then
        echo "❌ 下载失败: $REMOTE_CHECKSUM_URL"
        continue
    fi

    echo "✅ 开始同步项目: $project"

    # 下载或更新每个文件
    while IFS= read -r line; do
        [[ -z "$line" ]] && continue
        remote_md5=$(echo "$line" | awk '{print $1}')
        rel_path=$(echo "$line" | awk '{$1=""; print substr($0, 2)}')
        local_file="$TARGET_DIR/$rel_path"
        file_dir=$(dirname "$local_file")

        mkdir -p "$file_dir"

        if [ ! -f "$local_file" ]; then
            echo "⬇️ 下载新文件: $rel_path"
            wget -q -c --waitretry=5 --tries=3 -O "$local_file" "$REMOTE_URL/$project/$rel_path"
        else
            if ! echo "$remote_md5  $local_file" | md5sum -c --quiet; then
                echo "🔄 更新文件: $rel_path"
                rm -f "$local_file"
                wget -q -c --waitretry=5 --tries=3 -O "$local_file" "$REMOTE_URL/$project/$rel_path"
            else
                echo "✅ [$local_file:$remote_md5] 已经是最新的"
            fi
        fi
    done <"$CHECKSUM_FILENAME"

    # 删除多余的本地文件
    echo "🗑️ 清理多余文件..."
    find "$TARGET_DIR" -type f -not -name "checksum.md5" | while read -r file; do
        rel_path=$(echo "$file" | sed "s#$TARGET_DIR/##")
        grep -q "$rel_path" "$CHECKSUM_FILENAME" || rm -f "$file"
    done

    echo "✅ [$project] 同步完成"
done
