#!/bin/bash

# 設定參數
MAX_SIZE=400        # 大於此尺寸才縮圖 (px)
TARGET_SIZE=400      # 縮圖後的最長邊尺寸 (px)
INPUT_DIR="/media/sing/project/PhpStormProjects/aaplusvacation_laravel_v13/storage/app/public/tinymce/images" # 輸入資料夾
OUTPUT_DIR="/media/sing/project/PhpStormProjects/aaplusvacation_laravel_v13/storage/app/public/tinymce/images/images_resized" # 輸出資料夾
CPUS=$(nproc)        # 使用所有 CPU 核心數量

# 建立輸出資料夾
mkdir -p "$OUTPUT_DIR"

# 建立臨時檔案列表
TEMP_LIST=$(mktemp)
trap "rm -f $TEMP_LIST" EXIT

# 使用 find 递归搜尋所有圖片檔
find "$INPUT_DIR" -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" \) > "$TEMP_LIST"

# 處理函數（用於平行處理）
process_image() {
    img="$1"

    # 取得相對路徑
    relative_path="${img#$INPUT_DIR/}"
    output_dir="$OUTPUT_DIR/$(dirname "$relative_path")"

    # 建立對應的子資料夾結構
    mkdir -p "$output_dir"

    # 取得圖片尺寸
    dimensions=$(identify -format "%w %h" "$img" 2>/dev/null)
    [ -z "$dimensions" ] && return

    width=$(echo $dimensions | cut -d' ' -f1)
    height=$(echo $dimensions | cut -d' ' -f2)

    # 驗證是否為有效數字
    [[ ! "$width" =~ ^[0-9]+$ ]] && return
    [[ ! "$height" =~ ^[0-9]+$ ]] && return

    # 找出最長邊
    if [ "$width" -gt "$height" ]; then
        longest=$width
    else
        longest=$height
    fi

    # 如果大於 MAX_SIZE，則縮圖
    if [ "$longest" -gt "$MAX_SIZE" ]; then
        filename=$(basename "$img")
        output="$output_dir/$filename"

        convert "$img" -resize "${TARGET_SIZE}x${TARGET_SIZE}>" "$output"

        echo "[✓] 已縮圖: $relative_path ($width x $height → 最長邊 $TARGET_SIZE)"
    else
        echo "[ skips ] 跳過: $relative_path ($width x $height，小於 $MAX_SIZE)"
    fi
}

export -f process_image
export INPUT_DIR OUTPUT_DIR TARGET_SIZE MAX_SIZE

# 方法 1: 使用 GNU parallel（推薦，更快）
if command -v parallel &> /dev/null; then
    echo "使用 GNU parallel 多工處理（$CPUS 個執行緒）..."
    parallel -j "$CPUS" process_image :::: "$TEMP_LIST"

# 方法 2: 使用 xargs -P（內建，兼容性更好）
elif command -v xargs &> /dev/null; then
    echo "使用 xargs 多工處理（$CPUS 個執行緒）..."
    cat "$TEMP_LIST" | xargs -P "$CPUS" -I {} bash -c 'process_image "{}"'

# 方法 3: 迴圈（內建，無平行處理）
else
    echo "警告：未找到 parallel 或 xargs，使用單工處理..."
    while IFS= read -r img; do
        process_image "$img"
    done < "$TEMP_LIST"
fi

echo ""
echo "════════════════════════════════════════"
echo "║  處理完成！共處理 $(wc -l < "$TEMP_LIST") 張圖片"
echo "╚═══════════════════════════════════════"
