#!/usr/bin/env bash
# ---------------------------------------------------------------------------
# Snapshot / rollback de la DB Zammad (stack Docker locale de test).
# Capture TOUT l'état (config + tickets + pièces jointes stockées en DB) via pg_dump.
# Les dumps sont gitignorés (infra/zammad/snapshots/). Source canonique de la config =
# les seeds idempotents (config/routing, config/zammad). Ce script = "save point" rapide
# avant un changement risqué, et retour arrière facile.
#
# Usage :
#   ./snapshot.sh snapshot            # crée un dump horodaté
#   ./snapshot.sh list                # liste les dumps
#   ./snapshot.sh restore <file>      # restaure un dump (DROP + recreate DB) — interactif
# ---------------------------------------------------------------------------
set -euo pipefail

PG_CONTAINER="zammad-zammad-postgresql-1"
APP_CONTAINERS="zammad-zammad-railsserver-1 zammad-zammad-scheduler-1 zammad-zammad-websocket-1"
DB="zammad_production"
DB_USER="zammad"
DIR="$(cd "$(dirname "$0")" && pwd)/snapshots"
mkdir -p "$DIR"

case "${1:-}" in
  snapshot)
    ts="$(date +%Y%m%d-%H%M%S)"
    out="$DIR/zammad-${ts}.sql.gz"
    echo "Dumping $DB from $PG_CONTAINER ..."
    docker exec "$PG_CONTAINER" pg_dump -U "$DB_USER" "$DB" | gzip > "$out"
    echo "Snapshot écrit : $out ($(du -h "$out" | cut -f1))"
    ;;

  list)
    ls -1t "$DIR" 2>/dev/null || echo "(aucun snapshot)"
    ;;

  restore)
    file="${2:-}"
    if [ -z "$file" ]; then
      echo "usage: $0 restore <fichier.sql.gz>"; echo "Disponibles :"; ls -1t "$DIR" 2>/dev/null
      exit 1
    fi
    [ -f "$file" ] || file="$DIR/$file"
    [ -f "$file" ] || { echo "Introuvable : $file"; exit 1; }

    echo "ATTENTION : ceci va SUPPRIMER et recréer la DB '$DB' à partir de :"
    echo "  $file"
    read -r -p "Taper 'yes' pour confirmer : " ans
    [ "$ans" = "yes" ] || { echo "Annulé."; exit 1; }

    echo "Arrêt des conteneurs applicatifs ..."
    # shellcheck disable=SC2086
    docker stop $APP_CONTAINERS >/dev/null

    echo "Recréation de la DB ..."
    docker exec "$PG_CONTAINER" psql -U "$DB_USER" -d postgres -c \
      "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='$DB' AND pid<>pg_backend_pid();" >/dev/null
    docker exec "$PG_CONTAINER" psql -U "$DB_USER" -d postgres -c "DROP DATABASE IF EXISTS $DB;" >/dev/null
    docker exec "$PG_CONTAINER" psql -U "$DB_USER" -d postgres -c "CREATE DATABASE $DB OWNER $DB_USER;" >/dev/null

    echo "Restauration du dump ..."
    gunzip -c "$file" | docker exec -i "$PG_CONTAINER" psql -U "$DB_USER" -d "$DB" >/dev/null

    echo "Redémarrage des conteneurs applicatifs ..."
    # shellcheck disable=SC2086
    docker start $APP_CONTAINERS >/dev/null

    echo "Restauration terminée. Reconstruire l'index de recherche Elasticsearch :"
    echo "  docker exec -u zammad zammad-zammad-railsserver-1 bin/rails searchindex:rebuild"
    ;;

  *)
    echo "usage: $0 {snapshot|list|restore <file>}"
    exit 1
    ;;
esac
