#!/bin/bash

# +----------------------------------------------------------------------------+
# |    脚本: 将指定的 .pt 文件 (默认为 best.pt) 从 Nas_BackUp_Seg 复制到 BestMode...  |
# |    功能: 1. 自动查找源目录中所有 "weights/[指定文件名].pt" 文件。             |
# |          2. 将其复制到目标目录，并从路径中移除 "/weights" 中间层。
# |          3. 仅在目标文件不存在或内容不一致时才执行复制，提高效率。
# |          4. 提供可视化进度条和最终统计。
# |    V3.0: «-- 修改: 改为使用 --pt_name 命名参数                            |
# |    用法: ./script.sh [--pt_name "文件名.pt"] (例如: ./script.sh --pt_name "100.pt") «-- 修改
# +----------------------------------------------------------------------------+

# --- 1. 目录设置 ---
SOURCE_BASE_DIR=$(realpath "../Hardisk")
DEST_BASE_DIR=$(realpath "../BestMode_Predict_Results_DataSet_Public")

# --- 1b. 参数设置 --- «-- 修改: 替换为参数解析循环
# 设置默认文件名
TARGET_FILENAME="best.pt"

# 解析命令行参数
while [[ "$#" -gt 0 ]]; do
    case $1 in
        --pt_name)
            if [[ -n "$2" && ! "$2" =~ ^-- ]]; then
                TARGET_FILENAME="$2"
                shift # 消耗 "--pt_name"
                shift # 消耗它的值
            else
                echo "错误: '--pt_name' 需要一个文件名参数。" >&2
                exit 1
            fi
            ;;
        *)
            echo "未知参数: $1" >&2
            exit 1
            ;;
    esac
done

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

mkdir -p "$DEST_BASE_DIR"

echo "正在扫描源目录: $SOURCE_BASE_DIR"
echo "目标模型文件: $TARGET_FILENAME" # 告知用户当前在找哪个文件

# --- 3. 查找所有符合条件的文件 ---
echo "正在查找所有符合 '...-Yolo/YOLO*_*/weights/$TARGET_FILENAME' 结构的文件..."
readarray -d '' files_to_process < <(find "$SOURCE_BASE_DIR"/*-Yolo -path "*/YOLO*_*/weights/$TARGET_FILENAME" -type f -print0 2>/dev/null)
TOTAL_FILES=${#files_to_process[@]}

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

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

# --- 4. 进度条函数 ---
print_progress() {
    local current=$1
    local total=$2
    local term_width=$(tput cols)
    local bar_width=$((term_width - 35)) # 为文本留出更多空间

    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
    
    printf "\r拷贝进度: %3d%% [%s] %d/%d" $percent "$bar" $current $total
}

# --- 5. 执行复制操作 ---
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")
    
    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

# --- 6. 打印最终总结 ---
echo ""
echo "--------------------------------------------------"
echo "所有操作已完成！"
echo "  - 总共处理文件: $TOTAL_FILES (目标文件: $TARGET_FILENAME)"
echo "  - 已复制或更新的文件: $COPIED_COUNT"
echo "  - 因已存在且内容一致而跳过的文件: $SKIPPED_COUNT"