#!/bin/bash

# 定义源URL和目录
TARGET_URL="https://eulermaker.openeuler.openatom.cn/api/ems1/repositories/AGIROS_third_packages/openEuler%3A24.03-LTS/aarch64/Packages/"
LOCAL_DIR="./2612/aarch64/3-party/"
DOWNLOAD_DIR="./downloaded_packages"
REPORT_FILE="download_report.txt"

# 创建目录（如果不存在）
mkdir -p "$DOWNLOAD_DIR"
mkdir -p "$LOCAL_DIR"

# 函数：从URL或完整路径中提取包文件名
extract_filename() {
    local url="$1"
    echo "$url" | sed 's/.*\///'
}

# 函数：从包文件名中提取名称和版本信息
extract_package_info() {
    local filename="$1"
    # 移除.src.rpm后缀（如果存在）
    local clean_name="${filename%.src.rpm}"
    # 移除架构和.rpm后缀
    clean_name="${clean_name%.rpm}"
    # 移除架构特定后缀
    clean_name="${clean_name%.x86_64}"
    clean_name="${clean_name%.aarch64}"
    clean_name="${clean_name%.noarch}"
    clean_name="${clean_name%.riscv64}"
    # 移除可能的发行版后缀（如.oe2403）
    clean_name=$(echo "$clean_name" | sed 's/\.[^.]*$//')
    echo "$clean_name"
}

# 函数：获取RPM包的构建时间戳（返回Unix时间戳）
get_rpm_build_timestamp() {
    local rpm_file="$1"
    
    # 方法1: 尝试使用rpm查询构建时间的Unix时间戳
    local build_timestamp=$(rpm -qip "$rpm_file" 2>/dev/null | grep "Build Date" | sed 's/Build Date\s*:\s*//')
    
    if [ -n "$build_timestamp" ] && [ "$build_timestamp" != "unknown" ]; then
        # 将中文时间格式转换为标准格式
        # 示例: "2026年01月12日 星期一 21时30分10秒"
        
        # 移除星期几
        build_timestamp=$(echo "$build_timestamp" | sed 's/星期[一二三四五六日] //')
        
        # 替换中文字符为空格和冒号
        build_timestamp=$(echo "$build_timestamp" | sed 's/年/-/;s/月/-/;s/日 / /;s/时/:/;s/分/:/;s/秒//')
        
        # 转换为Unix时间戳
        local timestamp=$(date -d "$build_timestamp" +%s 2>/dev/null)
        
        if [ -n "$timestamp" ]; then
            echo "$timestamp"
            return
        fi
    fi
    
    # 方法2: 尝试直接使用文件的修改时间作为备用
    if [ -f "$rpm_file" ]; then
        echo $(stat -c %Y "$rpm_file" 2>/dev/null || echo 0)
    else
        echo "0"
    fi
}

# 函数：获取可读的构建时间字符串
get_rpm_build_time_str() {
    local rpm_file="$1"
    local build_time=$(rpm -qip "$rpm_file" 2>/dev/null | grep "Build Date" | sed 's/Build Date\s*:\s*//')
    if [ -n "$build_time" ]; then
        echo "$build_time"
    else
        echo "unknown"
    fi
}

# 函数：比较两个时间戳，返回较新的一个
compare_build_times() {
    local time1="$1"
    local time2="$2"
    
    # 如果其中一个时间未知，返回已知的时间
    if [ "$time1" = "0" ] || [ -z "$time1" ]; then
        echo "$time2"
        return
    fi
    if [ "$time2" = "0" ] || [ -z "$time2" ]; then
        echo "$time1"
        return
    fi
    
    # 直接比较时间戳（数字）
    if [ "$time1" -gt "$time2" ]; then
        echo "$time1"
    else
        echo "$time2"
    fi
}

# 第一步：下载所有目标源的包到临时目录
echo "正在下载目标源的所有包..."
target_links=$(curl -s "$TARGET_URL" | grep -o 'href="[^"]*\.rpm"' | sed 's/href="//;s/"$//')

# 处理目标源的每个链接
while IFS= read -r link; do
    # 提取文件名
    filename=$(extract_filename "$link")
    
    # 跳过.src.rpm文件
    if [[ $filename == *.src.rpm ]]; then
        continue
    fi
    
    # 只处理特定架构的包
    if [[ $filename == *.x86_64.rpm || $filename == *.aarch64.rpm || $filename == *.noarch.rpm || $filename == *.riscv64.rpm ]]; then
        # 构建完整的下载URL
        if [[ $link == http* ]]; then
            file_url="$link"
        else
            file_url="${TARGET_URL}${link}"
        fi
        
        echo "下载包: $file_url"
        wget -q -P "$DOWNLOAD_DIR" "$file_url"
    fi
done <<< "$target_links"

echo "下载完成，开始对比和更新..."

# 第二步：对比并更新本地包
updated_packages=()
new_packages=()

# 遍历下载的包
for downloaded_file in "$DOWNLOAD_DIR"/*.rpm; do
    if [ -f "$downloaded_file" ]; then
        filename=$(basename "$downloaded_file")
        local_file="$LOCAL_DIR/$filename"
        
        # 检查本地是否存在同名文件
        if [ -f "$local_file" ]; then
            # 获取构建时间戳（Unix时间戳）
            downloaded_timestamp=$(get_rpm_build_timestamp "$downloaded_file")
            local_timestamp=$(get_rpm_build_timestamp "$local_file")
            
            # 获取可读的时间字符串（用于报告）
            downloaded_time_str=$(get_rpm_build_time_str "$downloaded_file")
            local_time_str=$(get_rpm_build_time_str "$local_file")
            
            echo "比较包: $filename"
            echo "  下载包构建时间: $downloaded_time_str (时间戳: $downloaded_timestamp)"
            echo "  本地包构建时间: $local_time_str (时间戳: $local_timestamp)"
            
            # 比较时间戳
            if [ "$downloaded_timestamp" -gt "$local_timestamp" ]; then
                echo "  更新包: $filename (新构建时间: $downloaded_time_str, 旧构建时间: $local_time_str)"
                mv -f "$downloaded_file" "$local_file"
                updated_packages+=("$filename")
            else
                echo "  跳过包: $filename (无需更新)"
                rm -f "$downloaded_file"
            fi
        else
            # 本地不存在此包，直接移动
            downloaded_time_str=$(get_rpm_build_time_str "$downloaded_file")
            echo "添加新包: $filename (构建时间: $downloaded_time_str)"
            mv -f "$downloaded_file" "$local_file"
            new_packages+=("$filename")
        fi
    fi
done

# 第三步：清理临时目录
rm -rf "$DOWNLOAD_DIR"

# 生成下载报告
echo "生成下载报告..."
{
    echo "更新时间: $(date)"
    echo "目标源: $TARGET_URL"
    echo "本地目录: $LOCAL_DIR"
    echo ""
    echo "新增的包列表 (${#new_packages[@]} 个):"
    echo "===================================="
    for pkg in "${new_packages[@]}"; do
        echo "$pkg"
    done
    echo ""
    echo "更新的包列表 (${#updated_packages[@]} 个):"
    echo "===================================="
    for pkg in "${updated_packages[@]}"; do
        echo "$pkg"
    done
} > "$REPORT_FILE"

echo "更新完成! 新增了 ${#new_packages[@]} 个包，更新了 ${#updated_packages[@]} 个包"
echo "详细信息请查看: $REPORT_FILE"
