#!/usr/bin/env bash
set -euo pipefail

# Usage:
#   ./rename_smirkboy_files.sh [directory]
#   ./rename_smirkboy_files.sh [directory] --dry-run
#   ./rename_smirkboy_files.sh [directory] --prefix 假笑男孩
#
# Rule:
#   假笑男孩00006-不想说话想冷场.jpg -> 不想说话想冷场.jpg
#   Remove: "假笑男孩" + digits + "-"

DIR="."
DRY_RUN=0
PREFIX="假笑男孩"

regex_escape() {
  # Escape regex metacharacters so a literal prefix can be matched safely.
  printf '%s' "$1" | sed -E 's/[][(){}.^$*+?|\\-]/\\\\&/g'
}

while [[ $# -gt 0 ]]; do
  case "$1" in
    --dry-run|-n)
      DRY_RUN=1
      shift
      ;;
    --prefix|-p)
      if [[ $# -lt 2 ]]; then
        echo "Error: --prefix requires a value" >&2
        exit 1
      fi
      PREFIX="$2"
      shift 2
      ;;
    *)
      DIR="$1"
      shift
      ;;
  esac
done

prefix_re="$(regex_escape "$PREFIX")"

if [[ ! -d "$DIR" ]]; then
  echo "Error: directory not found: $DIR" >&2
  exit 1
fi

shopt -s nullglob

count_renamed=0
count_skipped=0

for path in "$DIR"/*; do
  [[ -f "$path" ]] || continue

  name="$(basename "$path")"

  # Match: <prefix> + digits + '-' + rest_of_name
  if [[ "$name" =~ ^${prefix_re}[0-9]+-(.+)$ ]]; then
    new_name="${BASH_REMATCH[1]}"
    new_path="$(dirname "$path")/$new_name"

    if [[ -e "$new_path" ]]; then
      echo "[SKIP] target exists: $new_name"
      ((count_skipped+=1))
      continue
    fi

    if [[ "$DRY_RUN" -eq 1 ]]; then
      echo "[DRY-RUN] $name -> $new_name"
    else
      mv -- "$path" "$new_path"
      echo "[RENAMED] $name -> $new_name"
    fi

    ((count_renamed+=1))
  fi
done

echo "Done. renamed=$count_renamed skipped=$count_skipped dry_run=$DRY_RUN"
