#!/usr/bin/env bash
# =============================================================================
# May-Facturation — Sauvegarde vers serveur secondaire o2switch
# Frequence recommandee : 1 fois par jour (cron 02h00)
# Rotation : 5 jours glissants sur le serveur de destination
#
# Reutilise le meme compte o2switch, la meme cle SSH et le meme serveur 2 que
# May-Secret, deploye sur le meme compte sc1nkdm7108
# (voir c:\wamp64\www\dev\version3\wetab\scripts\backup-wetab.sh et
# c:\wamp64\www\dev\may-software\symfony-may-secret\scripts\backup-may-secret.sh).
#
# CONFIGURATION — adapter APP_DIR ci-dessous si le sous-domaine differe de
# celui suppose ici (api.may-facturation.fr), voir scripts/README-backup.md
# =============================================================================

set -euo pipefail
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/mysql/bin:$PATH

# ── Variables a personnaliser ──────────────────────────────────────────────

# Serveur de production (serveur 1) — meme compte que May-Secret (sc1nkdm7108)
APP_DIR="/home/sc1nkdm7108/api.may-facturation.fr"      # Racine du projet Symfony en production (a verifier)
DB_NAME="sc1nkdm7108_may_facturation"                   # Nom de la base MySQL de PRODUCTION
DB_CNF="$HOME/.credentials/may_facturation_backup.cnf"  # Fichier de credentials MySQL (voir README-backup.md)

# Serveur de destination (serveur 2) — identique a WeTab / May-Secret
REMOTE_HOST="chorizo.o2switch.net"
REMOTE_USER="zjap0213"
REMOTE_PORT="22"
REMOTE_DIR="/home2/zjap0213/backups/may-facturation"  # Dossier deja cree par l'utilisateur
SSH_KEY="$HOME/.ssh/wetab_backup_key"                  # Reutilisation de la cle SSH existante

# Rotation (nombre de jours a conserver)
RETENTION_DAYS=5

# Dossier de logs
LOG_DIR="$HOME/logs"
LOG_FILE="$LOG_DIR/may-facturation-backup.log"

# Email d'alerte en cas d'echec (silencieux si tout se passe bien)
NOTIFY_EMAIL="christian.meneux@gmail.com"

# ── Initialisation ─────────────────────────────────────────────────────────

DATE=$(date +%Y-%m-%d_%H-%M)
LOCAL_TMP="$HOME/tmp/may-facturation-backup-$DATE"

mkdir -p "$LOCAL_TMP" "$LOG_DIR"

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

on_error() {
  local exit_code=$?
  local line_no=$1
  log "!!! ECHEC de la sauvegarde (ligne $line_no, code $exit_code) !!!"

  {
    echo "Subject: [ECHEC] Backup May-Facturation"
    echo "To: ${NOTIFY_EMAIL}"
    echo "Content-Type: text/plain; charset=utf-8"
    echo
    echo "La sauvegarde May-Facturation a echoue le $(date '+%Y-%m-%d %H:%M') (ligne $line_no, code $exit_code)."
    echo
    echo "--- Dernieres lignes du log ---"
    tail -n 60 "$LOG_FILE"
  } | /usr/sbin/sendmail -t

  rm -rf "$LOCAL_TMP"
  exit "$exit_code"
}

trap 'on_error $LINENO' ERR

log "=== Debut de la sauvegarde May-Facturation ($DATE) ==="

# ── 1. Dump de la base de donnees ─────────────────────────────────────────

log "Dump MySQL : $DB_NAME"

mysqldump \
  --defaults-extra-file="$DB_CNF" \
  --single-transaction \
  --routines \
  --triggers \
  "$DB_NAME" \
  | gzip -9 > "$LOCAL_TMP/may-facturation-db-$DATE.sql.gz"

log "  -> $(du -sh "$LOCAL_TMP/may-facturation-db-$DATE.sql.gz" | cut -f1) compresse"

# ── 2. Archive des factures PDF generees (conformite ISCA - archivage) ─────
# var/invoices contient les PDF de factures validees : documents legaux,
# a conserver au meme titre que la base (brief section 2.2/7 - critere
# "Archivage" du referentiel ISCA).

INVOICES_DIR="$APP_DIR/var/invoices"
if [ -d "$INVOICES_DIR" ]; then
  log "Archive des factures PDF : $INVOICES_DIR"

  tar -czf "$LOCAL_TMP/may-facturation-invoices-$DATE.tar.gz" \
    --exclude='*.tmp' \
    -C "$(dirname "$INVOICES_DIR")" \
    "$(basename "$INVOICES_DIR")"

  log "  -> $(du -sh "$LOCAL_TMP/may-facturation-invoices-$DATE.tar.gz" | cut -f1) compresse"
else
  log "Aucune facture a sauvegarder ($INVOICES_DIR inexistant)"
fi

# ── 3. Archive des fichiers partages (APP_SHARE_DIR) ───────────────────────

SHARE_DIR="$APP_DIR/var/share"
if [ -d "$SHARE_DIR" ]; then
  log "Archive des fichiers partages : $SHARE_DIR"

  tar -czf "$LOCAL_TMP/may-facturation-share-$DATE.tar.gz" \
    --exclude='*.tmp' \
    -C "$(dirname "$SHARE_DIR")" \
    "$(basename "$SHARE_DIR")"

  log "  -> $(du -sh "$LOCAL_TMP/may-facturation-share-$DATE.tar.gz" | cut -f1) compresse"
else
  log "Aucun fichier partage a sauvegarder ($SHARE_DIR inexistant)"
fi

# ── 4. Archive des cles JWT (config/jwt) ───────────────────────────────────
# Sans ces cles, impossible de reverifier les tokens deja emis apres restauration.

JWT_DIR="$APP_DIR/config/jwt"
if [ -d "$JWT_DIR" ]; then
  log "Archive des cles JWT : $JWT_DIR"

  tar -czf "$LOCAL_TMP/may-facturation-jwt-$DATE.tar.gz" \
    -C "$(dirname "$JWT_DIR")" \
    "$(basename "$JWT_DIR")"

  log "  -> $(du -sh "$LOCAL_TMP/may-facturation-jwt-$DATE.tar.gz" | cut -f1) compresse"
fi

# ── 5. Transfert vers le serveur secondaire ────────────────────────────────

log "Creation du dossier distant"

ssh -i "$SSH_KEY" -p "$REMOTE_PORT" \
  -o StrictHostKeyChecking=no \
  "$REMOTE_USER@$REMOTE_HOST" \
  "mkdir -p '$REMOTE_DIR/$DATE'"

log "Transfert rsync vers $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/$DATE/"

rsync -avz --progress \
  -e "ssh -i $SSH_KEY -p $REMOTE_PORT -o StrictHostKeyChecking=no" \
  "$LOCAL_TMP/" \
  "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/$DATE/" \
  >> "$LOG_FILE" 2>&1

log "  -> Transfert termine"

# ── 6. Rotation : suppression des sauvegardes de plus de N jours ───────────

log "Rotation : suppression des sauvegardes > $RETENTION_DAYS jours sur le serveur distant"

ssh -i "$SSH_KEY" -p "$REMOTE_PORT" \
  -o StrictHostKeyChecking=no \
  "$REMOTE_USER@$REMOTE_HOST" \
  "find '$REMOTE_DIR' -maxdepth 1 -type d -name '????-??-??_*' -mtime +$RETENTION_DAYS -exec rm -rf {} + && echo 'Rotation OK'"

# ── 7. Nettoyage local ─────────────────────────────────────────────────────

log "Nettoyage du dossier temporaire local"
rm -rf "$LOCAL_TMP"

log "=== Sauvegarde terminee avec succes ==="
echo ""
