#!/usr/bin/env bash
# Sauvegarde / restauration Sherlook sur OVH (à exécuter SUR le serveur).
#
# Install (une fois, depuis la machine locale) :
#   ./scripts/backup-ovh.sh --install
#
# Sur le serveur (SSH) :
#   ~/bin/sherlook-backup/backup.sh
#   ~/bin/sherlook-backup/backup.sh --db-only
#   ~/bin/sherlook-backup/backup.sh --uploads-only
#   ~/bin/sherlook-backup/list.sh
#   CONFIRM=RESTORE ~/bin/sherlook-backup/restore.sh 20260719_043000 --db
#   CONFIRM=RESTORE ~/bin/sherlook-backup/restore.sh 20260719_043000 --uploads
#   CONFIRM=RESTORE ~/bin/sherlook-backup/restore.sh 20260719_043000 --all
#
# Variables (optionnelles) :
#   API_DIR=/home/.../api-26
#   BACKUP_ROOT=/home/.../backups
#   KEEP_DAYS=14
#   INCLUDE_THUMBS=1   # inclure public/uploads/_thumbs (défaut : exclus)

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
# shellcheck source=lib.sh
source "$SCRIPT_DIR/lib.sh"

MODE="all"
for arg in "$@"; do
  case "$arg" in
    --db-only) MODE="db" ;;
    --uploads-only) MODE="uploads" ;;
    -h|--help)
      sed -n '2,24p' "$0"
      exit 0
      ;;
    *)
      echo "Option inconnue : $arg" >&2
      exit 1
      ;;
  esac
done

ensure_dirs
load_database_url

STAMP="$(date +%Y%m%d_%H%M%S)"
DEST="$BACKUP_ROOT/$STAMP"
mkdir -p "$DEST"

echo ">>> Sauvegarde Sherlook → $DEST"
echo "    API_DIR=$API_DIR"
echo "    DB=$DB_NAME @$DB_HOST"

MANIFEST="$DEST/manifest.txt"
{
  echo "stamp=$STAMP"
  echo "created_at=$(date -Iseconds)"
  echo "host=$(hostname 2>/dev/null || echo unknown)"
  echo "api_dir=$API_DIR"
  echo "db_host=$DB_HOST"
  echo "db_name=$DB_NAME"
  echo "db_user=$DB_USER"
} > "$MANIFEST"

if [[ "$MODE" == "all" || "$MODE" == "db" ]]; then
  echo ">>> Base MySQL (mysqldump | gzip)…"
  DB_OUT="$DEST/database.sql.gz"
  # --single-transaction : cohérent InnoDB sans lock long
  # --routines --triggers : procédures / triggers
  if ! mysqldump \
    --host="$DB_HOST" \
    --port="$DB_PORT" \
    --user="$DB_USER" \
    --password="$DB_PASS" \
    --single-transaction \
    --quick \
    --routines \
    --triggers \
    --default-character-set=utf8mb4 \
    "$DB_NAME" | gzip -c > "$DB_OUT"
  then
    echo "ERREUR : mysqldump a échoué." >&2
    rm -f "$DB_OUT"
    exit 1
  fi
  DB_SIZE="$(du -h "$DB_OUT" | awk '{print $1}')"
  echo "    OK database.sql.gz ($DB_SIZE)"
  echo "database=database.sql.gz" >> "$MANIFEST"
  echo "database_size=$DB_SIZE" >> "$MANIFEST"
fi

if [[ "$MODE" == "all" || "$MODE" == "uploads" ]]; then
  echo ">>> Dossier uploads (tar.gz)…"
  UPLOADS_DIR="$API_DIR/public/uploads"
  if [[ ! -d "$UPLOADS_DIR" ]]; then
    echo "ERREUR : introuvable : $UPLOADS_DIR" >&2
    exit 1
  fi
  UP_OUT="$DEST/uploads.tar.gz"
  TAR_EXCLUDES=(--exclude='.DS_Store')
  if [[ "${INCLUDE_THUMBS:-0}" != "1" ]]; then
    TAR_EXCLUDES+=(--exclude='_thumbs')
    echo "    (exclusion de _thumbs — régénérables)"
  fi
  # -C parent + uploads/ pour restaurer proprement dans public/
  tar -czf "$UP_OUT" "${TAR_EXCLUDES[@]}" -C "$API_DIR/public" uploads
  UP_SIZE="$(du -h "$UP_OUT" | awk '{print $1}')"
  echo "    OK uploads.tar.gz ($UP_SIZE)"
  echo "uploads=uploads.tar.gz" >> "$MANIFEST"
  echo "uploads_size=$UP_SIZE" >> "$MANIFEST"
fi

echo ">>> Rotation (KEEP_DAYS=$KEEP_DAYS)…"
prune_old_backups

echo ""
echo ">>> Terminé : $DEST"
ls -lh "$DEST"
echo ""
echo "Restauration (ATTENTION écrase les données) :"
echo "  CONFIRM=RESTORE $SCRIPT_DIR/restore.sh $STAMP --all"
