#!/usr/bin/env bash

# https://blog.hanlin.press/2025/09/ALAC-Verification-Guide/
set -o pipefail
export LC_ALL=${LC_ALL:-C.UTF-8}
export LANG=${LANG:-C.UTF-8}
CURRENT_DATE=$(date +%Y-%m-%d)
CURRENT_TIME=$(date +%H-%M-%S)
script_dir=$(cd "$(dirname "$0")" && pwd)
report_basename="ALAC_Scan_Report_${CURRENT_DATE}_${CURRENT_TIME}.txt"
report_file="${script_dir}/${report_basename}"
temp_log=$(mktemp -t ffmpeg_scan_error.XXXXXX.log)

problem_count=0
total_files_scanned=0

echo
echo "======================================================="
echo "== ALAC 编码问题扫描工具 20250911                    =="
echo "======================================================="
echo

if ! command -v ffmpeg >/dev/null 2>&1; then
  echo "[错误] 未在 PATH 中找到 ffmpeg"
  exit 1
fi

: > "$report_file"
{
  echo "ALAC 文件扫描报告"
  echo "生成时间: $(date '+%Y-%m-%d %H:%M:%S')"
  echo "======================================================"
} >> "$report_file"

append_report() {
  printf '%s\n' "$@" >> "$report_file"
}

process_file() {
  local file="$1"
  total_files_scanned=$((total_files_scanned + 1))
  echo
  echo "[$total_files_scanned] 正在检查: \"$file\""
  : > "$temp_log"
  ffmpeg -i "$file" -f wav -hide_banner -loglevel info -y /dev/null 2> "$temp_log"

  if grep -F -e "Invalid data found when processing input" \
             -e "Not yet implemented in FFmpeg" \
             -e "patch welcome" \
             -e "patches welcome" \
             -e "Syntax element" "$temp_log" >/dev/null 2>&1; then
    problem=true
  else
    problem=false
  fi

  append_report ""
  append_report "----------------------------------------"
  append_report "[文件] \"$file\""

  if $problem; then
    problem_count=$((problem_count + 1))
    echo "  [状态] 发现问题！"
    append_report "[状态] 发现问题！"
    append_report "[详情] FFmpeg 完整输出:"
    cat "$temp_log" >> "$report_file"
  else
    echo "  [状态] 正常"
    append_report "[状态] 正常"
    if grep -F " Audio:" "$temp_log" >/dev/null 2>&1; then
      while IFS= read -r line; do
        echo "  [信息] $line"
        append_report "[信息] $line"
      done < <(grep -F " Audio:" "$temp_log")
    fi
  fi
}

scan_directory() {
  local target_dir="$1"
  echo "--- 正在递归扫描文件夹: \"$target_dir\" ---"
  while IFS= read -r -d '' f; do
    process_file "$f"
  done < <(find "$target_dir" -type f -iname '*.m4a' -print0)
}

if [[ $# -eq 0 ]]; then
  echo "[模式] 未提供参数，将递归扫描当前目录。"
  echo
  scan_directory "."
else
  echo "[模式] 检测到传入参数，将处理指定的文件或文件夹。"
  echo
  for path in "$@"; do
    if [[ -d "$path" ]]; then
      scan_directory "$path"
    elif [[ -f "$path" ]]; then
      ext="${path##*.}"
      ext="${ext,,}"
      if [[ "$ext" == "m4a" ]]; then
        process_file "$path"
      else
        echo "[跳过] \"$(basename "$path")\" 不是 M4A 文件。"
      fi
    else
      echo "[跳过] \"$path\" 无法访问。"
    fi
  done
fi

echo
echo "--------------------------------------------------"
echo
echo "扫描完成！"
echo "总共扫描了 $total_files_scanned 个文件。"

if [[ $problem_count -eq 0 ]]; then
  summary="结果: 未发现任何存在编码问题的文件。"
else
  summary="结果: 共发现 $problem_count 个文件存在编码问题。"
fi
echo "$summary"

append_report ""
append_report "======================================================"
append_report "扫描总结:"
append_report "总共扫描了 ${total_files_scanned} 个 M4A 文件。"
append_report "$summary"
append_report "======================================================"

echo "详细的综合报告已生成:"
echo "\"$report_file\""

if [[ $problem_count -gt 0 ]]; then
  if command -v xdg-open >/dev/null 2>&1; then
    xdg-open "$report_file" >/dev/null 2>&1 &
  elif command -v open >/dev/null 2>&1; then
    open "$report_file" >/dev/null 2>&1 &
  fi
fi

rm -f "$temp_log"
echo
