#!/usr/bin/env bash
set -euo pipefail

# ==== CONFIG ====
DB_HOST="localhost"
DB_NAME="emprestait"
DB_USER="root"          # ou outro usuário com permissão
DB_PASS=""              # deixe vazio se usar ~/.my.cnf
BACKUP_DIR="/var/backups/emprestait"
RETENTION_DAYS=30

# Caminho do arquivo SQL de migração (edite ou passe como 1º argumento)
MIG_FILE="${1:-/root/migracoes/2025-08-rbac.sql}"

# ==== FUNÇÕES ====
ts() { date +%F-%H%M%S; }
msg() { echo "[$(ts)] $*"; }

need_mysql_pass() {
  # se ~/.my.cnf tiver credenciais, não precisamos de -p
  [[ -f "$HOME/.my.cnf" ]] && grep -q "password" "$HOME/.my.cnf" && return 1 || return 0
}

mysql_cmd() {
  if need_mysql_pass; then
    MYSQL_PWD="$DB_PASS" mysql -h "$DB_HOST" -u "$DB_USER" "$@"
  else
    mysql -h "$DB_HOST" -u "$DB_USER" "$@"
  fi
}

mysqldump_cmd() {
  if need_mysql_pass; then
    MYSQL_PWD="$DB_PASS" mysqldump "$@"
  else
    mysqldump "$@"
  fi
}

# ==== INÍCIO ====
mkdir -p "$BACKUP_DIR"
LOG="$BACKUP_DIR/deploy-$(ts).log"
exec > >(tee -a "$LOG") 2>&1

msg "Verificando conexão com MySQL em $DB_HOST..."
mysql_cmd -e "SELECT 1;" >/dev/null
msg "OK"

BACK_NAME="${DB_NAME}-backup-$(ts).sql.gz"
msg "Iniciando backup: $BACKUP_DIR/$BACK_NAME"

mysqldump_cmd \
  --single-transaction --routines --triggers --events \
  --default-character-set=utf8mb4 \
  -h "$DB_HOST" -u "$DB_USER" "$DB_NAME" \
| gzip -9 > "$BACKUP_DIR/$BACK_NAME"

msg "Backup concluído: $(ls -lh "$BACKUP_DIR/$BACK_NAME" | awk '{print $5, $9}')"

msg "Aplicando retenção (>$RETENTION_DAYS dias)..."
find "$BACKUP_DIR" -type f -name '*.sql.gz' -mtime +$RETENTION_DAYS -delete || true

if [[ -f "$MIG_FILE" ]]; then
  read -r -p "Aplicar migração SQL agora? [$MIG_FILE] (s/N): " CONFIRM
  if [[ "${CONFIRM,,}" == "s" || "${CONFIRM,,}" == "sim" ]]; then
    msg "Aplicando migração: $MIG_FILE"
    mysql_cmd "$DB_NAME" < "$MIG_FILE"
    msg "Migração aplicada com sucesso."
  else
    msg "Migração NÃO aplicada. Você pode rodar depois:  mysql -u $DB_USER -p $DB_NAME < $MIG_FILE"
  fi
else
  msg "AVISO: Arquivo de migração não encontrado em $MIG_FILE. Apenas backup foi feito."
fi

msg "Tudo pronto. Log: $LOG"
