#!/bin/bash
# =============================================================
#  AMA EDU - Script d'import VPS
#  Fichier : /opt/amaedu/sync_import.sh
#  Usage   : bash sync_import.sh dump_20260312_100000.sql.gz
# =============================================================

# ── Configuration ─────────────────────────────────────────────
APP_URL="https://amaedu.servicesproviders.org"
DB_USER="amaedu_user"
DB_PASS="CHANGE_ME"
DB_NAME="amaedu"

BACKUP_DIR="/opt/amaedu/backups"
UPLOAD_DIR="/tmp"
LOG_FILE="/var/log/amaedu/sync_import.log"
APP_DIR="/var/www/amaedu"

# ── Fonctions ─────────────────────────────────────────────────
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

abort() {
    log "ERREUR : $1"

    # Rollback si backup disponible
    if [ -n "$BACKUP_PATH" ] && [ -f "$BACKUP_PATH" ]; then
        log "Rollback en cours depuis $BACKUP_PATH..."
        gunzip -c "$BACKUP_PATH" | mysql \
            -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" 2>> "$LOG_FILE"
        if [ $? -eq 0 ]; then
            log "Rollback réussi - base restaurée"
        else
            log "CRITIQUE : Rollback échoué ! Intervention manuelle requise."
        fi
    fi

    # Désactiver maintenance si active
    [ -f "$APP_DIR/maintenance.flag" ] && rm -f "$APP_DIR/maintenance.flag"

    exit 1
}

# ── Vérifications ─────────────────────────────────────────────
mkdir -p "$BACKUP_DIR" "$(dirname "$LOG_FILE")"

ARCHIVE_FILE="$1"

if [ -z "$ARCHIVE_FILE" ]; then
    log "ERREUR : nom de fichier manquant en argument."
    exit 1
fi

ARCHIVE_PATH="$UPLOAD_DIR/$ARCHIVE_FILE"

if [ ! -f "$ARCHIVE_PATH" ]; then
    log "ERREUR : fichier introuvable : $ARCHIVE_PATH"
    exit 1
fi

DATE=$(date +"%Y%m%d_%H%M%S")
log "=== Début import : $ARCHIVE_FILE ($DATE) ==="

# ── Étape 1 : Backup DB existante ─────────────────────────────
log "Étape 1 : Backup base de données actuelle..."

BACKUP_PATH="$BACKUP_DIR/backup_before_sync_${DATE}.sql.gz"

mysqldump \
    --single-transaction \
    --routines \
    --triggers \
    -u "$DB_USER" \
    -p"$DB_PASS" \
    "$DB_NAME" 2>> "$LOG_FILE" | gzip > "$BACKUP_PATH"

[ $? -eq 0 ] || abort "Échec du backup de sécurité."
[ -s "$BACKUP_PATH" ] || abort "Backup vide, import annulé par sécurité."

BACKUP_SIZE=$(du -sh "$BACKUP_PATH" | cut -f1)
log "Backup OK : $BACKUP_PATH ($BACKUP_SIZE)"

# ── Étape 2 : Vérifier l'intégrité de l'archive ───────────────
log "Étape 2 : Vérification intégrité archive..."

gunzip -t "$ARCHIVE_PATH" 2>> "$LOG_FILE"
[ $? -eq 0 ] || abort "Archive corrompue ou incomplète."
log "Archive intègre."

# ── Étape 3 : Activer maintenance ─────────────────────────────
log "Étape 3 : Activation maintenance..."
touch "$APP_DIR/maintenance.flag"
log "Maintenance activée."

# ── Étape 4 : Import base de données ──────────────────────────
log "Étape 4 : Import base de données..."

# Désactiver les contraintes FK pendant l'import pour éviter les erreurs d'ordre
mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" \
    -e "SET FOREIGN_KEY_CHECKS=0;" 2>> "$LOG_FILE"

gunzip -c "$ARCHIVE_PATH" | mysql \
    -u "$DB_USER" \
    -p"$DB_PASS" \
    "$DB_NAME" 2>> "$LOG_FILE"

IMPORT_EXIT=$?

mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" \
    -e "SET FOREIGN_KEY_CHECKS=1;" 2>> "$LOG_FILE"

[ $IMPORT_EXIT -eq 0 ] || abort "Échec de l'import MySQL."
log "Import MySQL terminé."

# ── Étape 5 : Migrations Symfony ──────────────────────────────
log "Étape 5 : Migrations Symfony..."

cd "$APP_DIR" && php bin/console doctrine:migrations:migrate --no-interaction \
    >> "$LOG_FILE" 2>&1

if [ $? -ne 0 ]; then
    log "Attention : migrations Symfony en erreur (non bloquant si aucune migration en attente)"
fi

# Vider le cache Symfony
php bin/console cache:clear --env=prod >> "$LOG_FILE" 2>&1
log "Cache Symfony vidé."

# ── Étape 6 : Désactiver maintenance ──────────────────────────
log "Étape 6 : Désactivation maintenance..."
rm -f "$APP_DIR/maintenance.flag"
log "Maintenance désactivée."

# ── Étape 7 : Test applicatif ─────────────────────────────────
log "Étape 7 : Test application en ligne..."

# Attendre 2 secondes que le serveur reprenne
sleep 2

HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" \
    --max-time 15 \
    "$APP_URL" 2>/dev/null)

log "HTTP status : $HTTP_STATUS"

if [ "$HTTP_STATUS" = "200" ] || [ "$HTTP_STATUS" = "302" ]; then
    log "Application répond correctement (HTTP $HTTP_STATUS)"
else
    abort "Application ne répond pas correctement (HTTP $HTTP_STATUS). Rollback déclenché."
fi

# ── Étape 8 : Nettoyage ───────────────────────────────────────
log "Étape 8 : Nettoyage..."

# Supprimer l'archive importée
rm -f "$ARCHIVE_PATH"

# Garder seulement les 10 derniers backups
ls -t "$BACKUP_DIR"/backup_before_sync_*.sql.gz 2>/dev/null \
    | tail -n +11 \
    | xargs rm -f 2>/dev/null

log "Nettoyage terminé."

# ── Succès ────────────────────────────────────────────────────
log "=== Import terminé avec succès : $ARCHIVE_FILE ==="
echo "SYNC_OK"
exit 0
