#!/bin/bash
# =============================================================
#  AMA EDU - Script de synchronisation LOCAL → VPS
#  Version : 1.0
#  Usage   : bash sync.sh
# =============================================================

# ── Configuration ─────────────────────────────────────────────
LOCAL_URL="http://localhost"
VPS_HOST="161.97.128.28"
VPS_USER="sync"
VPS_SSH_KEY="$HOME/.ssh/amaedu_sync_key"
VPS_SCRIPT="/opt/amaedu/sync_import.sh"
VPS_UPLOAD_DIR="/tmp"

DB_USER="amaedu_user"
DB_PASS="CHANGE_ME"
DB_NAME="amaedu"

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LOG_DIR="$SCRIPT_DIR/../logs"
LOG_FILE="$LOG_DIR/sync.log"
DUMP_DIR="$SCRIPT_DIR/../dumps"

# ── Couleurs terminal ──────────────────────────────────────────
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

# ── Fonctions utilitaires ──────────────────────────────────────
log() {
    local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $1"
    echo "$msg" >> "$LOG_FILE"
    echo -e "${CYAN}$msg${NC}"
}

log_ok() {
    local msg="[$(date '+%Y-%m-%d %H:%M:%S')] ✔ $1"
    echo "$msg" >> "$LOG_FILE"
    echo -e "${GREEN}$msg${NC}"
}

log_err() {
    local msg="[$(date '+%Y-%m-%d %H:%M:%S')] ✖ ERREUR : $1"
    echo "$msg" >> "$LOG_FILE"
    echo -e "${RED}$msg${NC}"
}

step() {
    echo ""
    echo -e "${YELLOW}── Étape $1 : $2 ──${NC}"
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] STEP $1 - $2" >> "$LOG_FILE"
}

abort() {
    log_err "$1"
    # Toujours tenter d'enlever la maintenance si erreur
    curl -sf "$LOCAL_URL/maintenance_off" > /dev/null 2>&1 || true
    echo ""
    echo -e "${RED}╔══════════════════════════════════════════╗${NC}"
    echo -e "${RED}║   SYNCHRONISATION ÉCHOUÉE                ║${NC}"
    echo -e "${RED}║   Consultez : logs/sync.log              ║${NC}"
    echo -e "${RED}╚══════════════════════════════════════════╝${NC}"
    exit 1
}

# ── Préparation ────────────────────────────────────────────────
mkdir -p "$LOG_DIR" "$DUMP_DIR"

DATE=$(date +"%Y%m%d_%H%M%S")
DUMP_FILE="dump_${DATE}.sql"
ARCHIVE_FILE="${DUMP_FILE}.gz"
DUMP_PATH="$DUMP_DIR/$DUMP_FILE"
ARCHIVE_PATH="$DUMP_DIR/$ARCHIVE_FILE"

# ── Début ──────────────────────────────────────────────────────
echo ""
echo -e "${CYAN}╔══════════════════════════════════════════╗${NC}"
echo -e "${CYAN}║   AMA EDU - SYNCHRONISATION EN COURS     ║${NC}"
echo -e "${CYAN}╚══════════════════════════════════════════╝${NC}"
log "Démarrage synchronisation ($DATE)"

# ── Étape 1 : Vérifications préalables ────────────────────────
step 1 "Vérifications préalables"

# Vérifier connexion internet
log "Test connexion internet..."
ping -c 1 8.8.8.8 > /dev/null 2>&1 || abort "Pas de connexion internet. Vérifiez le réseau."
log_ok "Connexion internet OK"

# Vérifier accès SSH au VPS
log "Test connexion VPS..."
ssh -i "$VPS_SSH_KEY" -o ConnectTimeout=10 -o BatchMode=yes \
    "$VPS_USER@$VPS_HOST" "echo ok" > /dev/null 2>&1 \
    || abort "Impossible de se connecter au VPS. Vérifiez la clé SSH et le réseau."
log_ok "Connexion VPS OK"

# Vérifier mysqldump
command -v mysqldump > /dev/null 2>&1 || abort "mysqldump introuvable. MySQL client non installé."
log_ok "mysqldump disponible"

# ── Étape 2 : Mise en maintenance ─────────────────────────────
step 2 "Activation mode maintenance"

MAINTENANCE_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
    -X POST "$LOCAL_URL/maintenance_on" 2>/dev/null)

if [ "$MAINTENANCE_CODE" = "200" ] || [ "$MAINTENANCE_CODE" = "302" ]; then
    log_ok "Mode maintenance activé"
else
    log "Attention : maintenance retourne HTTP $MAINTENANCE_CODE (on continue)"
fi

# ── Étape 3 : Dump base de données locale ─────────────────────
step 3 "Export base de données locale"

mysqldump \
    --single-transaction \
    --routines \
    --triggers \
    --events \
    -u "$DB_USER" \
    -p"$DB_PASS" \
    "$DB_NAME" > "$DUMP_PATH" 2>> "$LOG_FILE"

[ $? -eq 0 ] || abort "Échec du dump MySQL local."
[ -s "$DUMP_PATH" ] || abort "Le fichier dump est vide."

DUMP_SIZE=$(du -sh "$DUMP_PATH" | cut -f1)
log_ok "Dump créé : $DUMP_FILE ($DUMP_SIZE)"

# ── Étape 4 : Compression ─────────────────────────────────────
step 4 "Compression du dump"

gzip -f "$DUMP_PATH"
[ $? -eq 0 ] || abort "Échec de la compression."

ARCHIVE_SIZE=$(du -sh "$ARCHIVE_PATH" | cut -f1)
log_ok "Archive créée : $ARCHIVE_FILE ($ARCHIVE_SIZE)"

# ── Étape 5 : Upload vers VPS ─────────────────────────────────
step 5 "Envoi vers le serveur central"

scp -i "$VPS_SSH_KEY" \
    -o ConnectTimeout=30 \
    "$ARCHIVE_PATH" \
    "$VPS_USER@$VPS_HOST:$VPS_UPLOAD_DIR/$ARCHIVE_FILE"

[ $? -eq 0 ] || abort "Échec de l'upload vers le VPS."
log_ok "Fichier envoyé au serveur"

# ── Étape 6 : Lancer l'import sur le VPS ──────────────────────
step 6 "Import et synchronisation sur le serveur central"

VPS_OUTPUT=$(ssh -i "$VPS_SSH_KEY" \
    -o ConnectTimeout=60 \
    "$VPS_USER@$VPS_HOST" \
    "bash $VPS_SCRIPT $ARCHIVE_FILE" 2>&1)

VPS_EXIT=$?
echo "$VPS_OUTPUT" >> "$LOG_FILE"

[ $VPS_EXIT -eq 0 ] || abort "Échec de l'import sur le VPS. Détail : $VPS_OUTPUT"
log_ok "Import VPS réussi"

# ── Étape 7 : Fin de maintenance ──────────────────────────────
step 7 "Désactivation mode maintenance"

curl -sf -X POST "$LOCAL_URL/maintenance_off" > /dev/null 2>&1
log_ok "Mode maintenance désactivé"

# ── Nettoyage des anciennes archives (> 7 jours) ──────────────
find "$DUMP_DIR" -name "dump_*.sql.gz" -mtime +7 -delete 2>/dev/null
log "Nettoyage archives anciennes effectué"

# ── Succès ────────────────────────────────────────────────────
log_ok "Synchronisation terminée avec succès"
echo ""
echo -e "${GREEN}╔══════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║   ✔  SYNCHRONISATION RÉUSSIE             ║${NC}"
echo -e "${GREEN}║   Les données sont sur le serveur.       ║${NC}"
echo -e "${GREEN}╚══════════════════════════════════════════╝${NC}"
echo ""
exit 0
