#!/usr/bin/env bash
# backup-db.sh — Sauvegarde MySQL + rsync vers VPS de backup
# Ce script tourne SUR le VPS de production (via cron).
# Copier dans /home/deploy/backup-db.sh et chmod +x
set -euo pipefail

# ─── Configuration ────────────────────────────────────────────────────────────
DB_NAME="manahote"
DB_USER="manahote"
DB_PASS=""          # À remplir (ou utiliser ~/.my.cnf)
DB_HOST="localhost"

LOCAL_BACKUP_DIR="/home/deploy/backups"
LOCAL_RETENTION_DAYS=7

BACKUP_VPS_USER="deploy"
BACKUP_VPS_HOST=""  # À remplir : IP ou hostname du VPS de backup
BACKUP_VPS_PATH="/backups/manahote"
REMOTE_RETENTION_DAYS=30

LOG_FILE="/var/log/manahote/backup.log"

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

die() {
    log "ERREUR : $*"
    # Notification mail si sendmail disponible
    if command -v sendmail &>/dev/null; then
        echo -e "Subject: [manahote] ECHEC backup DB\n\n$*" | sendmail root
    fi
    exit 1
}

# ─── Backup local ────────────────────────────────────────────────────────────
mkdir -p "${LOCAL_BACKUP_DIR}"

TIMESTAMP=$(date '+%Y-%m-%d_%H%M%S')
BACKUP_FILE="${LOCAL_BACKUP_DIR}/${DB_NAME}_${TIMESTAMP}.sql.gz"

log "Début backup : ${BACKUP_FILE}"

mysqldump \
    --host="${DB_HOST}" \
    --user="${DB_USER}" \
    --password="${DB_PASS}" \
    --single-transaction \
    --routines \
    --triggers \
    "${DB_NAME}" \
  | gzip > "${BACKUP_FILE}" \
  || die "mysqldump a échoué"

BACKUP_SIZE=$(du -sh "${BACKUP_FILE}" | cut -f1)
log "Backup créé : ${BACKUP_FILE} (${BACKUP_SIZE})"

# ─── Rotation locale ─────────────────────────────────────────────────────────
find "${LOCAL_BACKUP_DIR}" -name "${DB_NAME}_*.sql.gz" \
    -mtime +${LOCAL_RETENTION_DAYS} -delete
log "Rotation locale : fichiers > ${LOCAL_RETENTION_DAYS} jours supprimés"

# ─── Transfert vers VPS de backup ────────────────────────────────────────────
if [ -z "${BACKUP_VPS_HOST}" ]; then
    log "AVERTISSEMENT : BACKUP_VPS_HOST non configuré, transfert ignoré"
else
    ssh "${BACKUP_VPS_USER}@${BACKUP_VPS_HOST}" "mkdir -p ${BACKUP_VPS_PATH}"

    rsync -az "${BACKUP_FILE}" \
        "${BACKUP_VPS_USER}@${BACKUP_VPS_HOST}:${BACKUP_VPS_PATH}/" \
      || die "rsync vers VPS backup a échoué"

    log "Transfert rsync OK → ${BACKUP_VPS_HOST}:${BACKUP_VPS_PATH}"

    # Rotation distante
    ssh "${BACKUP_VPS_USER}@${BACKUP_VPS_HOST}" \
        "find ${BACKUP_VPS_PATH} -name '${DB_NAME}_*.sql.gz' -mtime +${REMOTE_RETENTION_DAYS} -delete"
    log "Rotation distante : fichiers > ${REMOTE_RETENTION_DAYS} jours supprimés"
fi

log "Backup terminé avec succès."
