#!/bin/bash

# +----------------------------------------------------------------------------+
# |    脚本: 将 best_model.pth 从 Hardisk 复制到 BestMode_Predict_Results_DataSet_Public      |
# |    说明: 此版本优化了复制逻辑，仅在文件不存在或内容不一致时才复制。        |
# |          同时包含一个可视化的进度条。 (已修正语法错误)                     |
# |    用法: ./copy_models.sh                                                  |
# +----------------------------------------------------------------------------+

# 设置源目录和目标目录的基础路径
# realpath确保我们获得的是绝对路径，避免相对路径可能带来的问题
SOURCE_BASE_DIR=$(realpath "../Hardisk")
DEST_BASE_DIR=$(realpath "../BestMode_Predict_Results_DataSet_Public")

# 检查源目录是否存在
if [ ! -d "$SOURCE_BASE_DIR" ]; then
    echo "错误: 源目录 '$SOURCE_BASE_DIR' 不存在。"
    exit 1
fi

# 确保目标基础目录存在
mkdir -p "$DEST_BASE_DIR"

echo "正在准备操作..."

# --- 第1步: 查找所有文件并存储到数组中 ---
# 使用 find -print0 和 readarray -d '' 的组合，可以安全处理任何包含特殊字符的文件名
# 这样只需查找一次，提高了效率和健壮性
echo "正在查找所有 'best_model.pth' 文件..."
readarray -d '' files_to_process < <(find "$SOURCE_BASE_DIR" -path "*-SegModel/*" -name "best_model.pth" -type f -print0 2>/dev/null)
TOTAL_FILES=${#files_to_process[@]}


if [ "$TOTAL_FILES" -eq 0 ]; then
    echo "在源目录中没有找到任何 'best_model.pth' 文件。脚本退出。"
    exit 0
fi

echo "总共找到 $TOTAL_FILES 个模型文件需要处理。"
echo "--------------------------------------------------"

# --- 进度条函数 ---
# 参数1: 当前文件数
# 参数2: 文件总数
print_progress() {
    local current=$1
    local total=$2
    # 减去更多的空间以容纳状态信息
    local term_width=$(tput cols)
    local bar_width=$((term_width - 30))

    # 确保 bar_width 不为负
    if [ "$bar_width" -lt 10 ]; then
        bar_width=10
    fi

    # 计算百分比
    local percent=$((current * 100 / total))
    
    # 计算已完成部分的长度
    local filled_len=$((bar_width * percent / 100))
    
    # 准备进度条的显示字符
    local bar=""
    for ((i=0; i<filled_len; i++)); do bar+="="; done
    for ((i=filled_len; i<bar_width; i++)); do bar+=" "; done
    
    # 使用 \r (回车符) 让光标回到行首，实现单行刷新效果
    printf "\r处理进度: %3d%% [%s] %d/%d" $percent "$bar" $current $total
}


# --- 第2步: 执行处理并显示进度条 ---
CURRENT_FILE=0
COPIED_COUNT=0
SKIPPED_COUNT=0

# 遍历之前查找到的文件列表
for source_file_path in "${files_to_process[@]}"; do
    # 【安全检查】如果数组中因意外情况包含空元素，则跳过此次循环
    if [[ -z "$source_file_path" ]]; then
        continue
    fi
    
    # 增加当前文件计数器
    ((CURRENT_FILE++))

    # 【修正部分】构建目标文件路径，请确保这一区域的代码和下面完全一致
    # 从完整源路径中移除基础目录部分，得到相对路径
    relative_path="${source_file_path#"$SOURCE_BASE_DIR"}"
    # 组合目标基础目录和相对路径，得到完整目标路径
    dest_file_path="${DEST_BASE_DIR}${relative_path}"
    dest_dir_path=$(dirname "$dest_file_path")
    
    # 优化点: 检查目标文件是否存在以及内容是否一致
    # 1. [ ! -f "$dest_file_path" ]: 目标文件不存在，则需要复制
    # 2. ! cmp -s "$source_file_path" "$dest_file_path": 目标文件存在，但内容不一致 (cmp -s 在文件相同时返回0, 不同时返回非0), 也需要复制
    if [ ! -f "$dest_file_path" ] || ! cmp -s "$source_file_path" "$dest_file_path"; then
        # 创建目标目录 (如果不存在)
        mkdir -p "$dest_dir_path"
        
        # 执行复制操作
        cp "$source_file_path" "$dest_file_path"
        ((COPIED_COUNT++))
    else
        # 文件已存在且内容一致，跳过
        ((SKIPPED_COUNT++))
    fi
    
    # 调用函数，更新屏幕上的进度条
    print_progress $CURRENT_FILE $TOTAL_FILES
done

# 循环结束后，打印一个换行符，使光标移到下一行
echo ""
echo "--------------------------------------------------"
echo "所有操作已完成！"
echo "  - 总共处理文件: $TOTAL_FILES"
echo "  - 复制或更新的文件: $COPIED_COUNT"
echo "  - 已存在且内容一致而跳过的文件: $SKIPPED_COUNT"