#!/bin/bash
# ============================================================================
# ODETOOL — Restauration d'une sauvegarde locale
# ============================================================================
# Emploi :
#   ./restaure-odetool.sh <dossier_de_sauvegarde> [base]
#
#   ./restaure-odetool.sh ~/ODETOOL-sauvegardes/2026-10-07_030000
#        → restaure TOUTES les bases du dossier (écrase l'état actuel)
#
#   ./restaure-odetool.sh ~/ODETOOL-sauvegardes/2026-10-07_030000 workspace_essai2
#        → ne restaure QUE la base indiquée (un seul espace de travail)
#
# ATTENTION : la restauration ÉCRASE l'état actuel de la (des) base(s)
# concernée(s). Vérifier le dossier avant de lancer.
# ============================================================================
set -uo pipefail

if [ $# -lt 1 ]; then
  echo "Emploi : $0 <dossier_de_sauvegarde> [base]"
  exit 1
fi

SRC="$1"
ONLY_DB="${2:-}"
MYSQL_BIN="/Applications/MAMP/Library/bin/mysql80/bin"
PHP_BIN="/Applications/MAMP/bin/php/php8.3.30/bin/php"
ODETOOL_ROOT="/Applications/MAMP/htdocs/odetool"
SOCKET="/Applications/MAMP/tmp/mysql/mysql.sock"
CRED_FILE="$ODETOOL_ROOT/api/Config/db_credentials.php"

if [ ! -d "$SRC" ]; then
  echo "ERREUR : dossier $SRC introuvable"; exit 1
fi

eval "$($PHP_BIN -r '
$c = require $argv[1];
echo "DB_USER=" . escapeshellarg($c["user"]) . " DB_PASS=" . escapeshellarg($c["password"]);
' "$CRED_FILE" 2>/dev/null)"

MYSQL="$MYSQL_BIN/mysql --socket=$SOCKET -u$DB_USER"
[ -n "$DB_PASS" ] && MYSQL="$MYSQL -p$DB_PASS"

# Avertissement + confirmation
if [ -n "$ONLY_DB" ]; then
  echo "→ Restauration de la base : $ONLY_DB"
else
  echo "→ Restauration de TOUTES les bases de : $SRC"
fi
echo "  L'état actuel sera ÉCRASÉ. Continuer ? (o/N)"
read -r REP
# NB : test portable (le bash 3.2 de macOS ne connaît pas ${REP,,})
if [ "$REP" != "o" ] && [ "$REP" != "O" ]; then echo "Abandon."; exit 0; fi

ERRORS=0
for FILE in "$SRC"/*.sql.gz; do
  [ -f "$FILE" ] || continue
  BASE=$(basename "$FILE" .sql.gz)
  if [ -n "$ONLY_DB" ] && [ "$BASE" != "$ONLY_DB" ]; then continue; fi
  echo "  Restauration de ${BASE}…"
  # NB : ${BASE} avec accolades — le bash 3.2 de macOS absorbe le caractère
  # multi-octets «…» collé au nom de variable sans accolades
  # NB : gzip -dc (et non zcat) : portable macOS/Linux — le zcat de macOS
  # ne décompresse que le format .Z
  if gzip -dc "$FILE" | $MYSQL 2>/tmp/odetool-restore-err.txt; then
    echo "  OK  $BASE"
  else
    echo "  ECHEC $BASE : $(cat /tmp/odetool-restore-err.txt)"; ERRORS=$((ERRORS+1))
  fi
done

# Dossier saves/ éventuel
SAVES_TAR="$SRC/saves.tar.gz"
if [ -f "$SAVES_TAR" ] && [ -z "$ONLY_DB" ]; then
  echo "  Restauration du dossier saves/…"
  tar -xzf "$SAVES_TAR" -C "$ODETOOL_ROOT" && echo "  OK  saves/" || { echo "  ECHEC saves/"; ERRORS=$((ERRORS+1)); }
fi

[ "$ERRORS" -gt 0 ] && { echo "Terminé avec $ERRORS erreur(s)."; exit 1; }
echo "Restauration terminée sans erreur."
