#!/usr/bin/env bash
# Backup criptografado do ATM: banco + arquivos (uploads, PDFs, sessão do WhatsApp).
# Instalação:
#   1) cp deploy/backup.sh /usr/local/bin/atm-backup && chmod 700 /usr/local/bin/atm-backup
#   2) /etc/atm/mysql-backup.cnf (chmod 600):   [client]\n user=atm_backup\n password=SENHA
#   3) Criptografia por CHAVE PÚBLICA (recomendado: o servidor só consegue CRIAR backups, não abri-los):
#        gpg --import minha-chave-publica.asc ; defina BACKUP_GPG_RECIPIENT=seu@email
#      (alternativa: BACKUP_PASSFILE=/etc/atm/backup.pass com chmod 600 — a senha fica no servidor)
#   4) cron diário:  30 2 * * *  /usr/local/bin/atm-backup >> /var/log/atm-backup.log 2>&1
#   5) COPIE /var/backups/atm para FORA do servidor (outro provedor/HD). Backup só no mesmo servidor não é backup.
#
# ⚠ A DATA_MASTER_KEY NÃO entra neste backup de propósito: guarde-a à parte (cofre/gerenciador de senhas).
#   Backup do banco + a chave guardada junto = quem roubar o backup lê os dados.
set -euo pipefail
umask 077

APP_DIR="${APP_DIR:-/opt/atm}"
DB_NAME="${DB_NAME:-atm_db}"
DEST="${BACKUP_DIR:-/var/backups/atm}"
MYSQL_CNF="${MYSQL_CNF:-/etc/atm/mysql-backup.cnf}"
DIAS="${BACKUP_DIAS:-30}"
STAMP="$(date +%Y%m%d-%H%M%S)"

mkdir -p "$DEST"
TMP="$(mktemp -d)"; trap 'rm -rf "$TMP"' EXIT

cifrar() {  # lê stdin, escreve criptografado em $1
  if [ -n "${BACKUP_GPG_RECIPIENT:-}" ]; then
    gpg --batch --yes --trust-model always --encrypt --recipient "$BACKUP_GPG_RECIPIENT" --output "$1"
  elif [ -n "${BACKUP_PASSFILE:-}" ]; then
    gpg --batch --yes --symmetric --cipher-algo AES256 --passphrase-file "$BACKUP_PASSFILE" --output "$1"
  else
    echo "Defina BACKUP_GPG_RECIPIENT ou BACKUP_PASSFILE (backup sem criptografia não é permitido)" >&2; exit 1
  fi
}

echo "[$(date -Is)] backup do banco..."
mysqldump --defaults-extra-file="$MYSQL_CNF" --single-transaction --routines --triggers --no-tablespaces "$DB_NAME" \
  | gzip -9 | cifrar "$DEST/db-$STAMP.sql.gz.gpg"

echo "[$(date -Is)] backup dos arquivos..."
tar -C "$APP_DIR" -czf - --ignore-failed-read storage auth_info_baileys data 2>/dev/null | cifrar "$DEST/arquivos-$STAMP.tar.gz.gpg"

( cd "$DEST" && sha256sum db-$STAMP.sql.gz.gpg arquivos-$STAMP.tar.gz.gpg >> SHA256SUMS )

# rotação: apaga backups mais antigos que $DIAS dias
find "$DEST" -type f \( -name 'db-*.gpg' -o -name 'arquivos-*.gpg' \) -mtime +"$DIAS" -delete

echo "[$(date -Is)] OK -> $DEST ($(du -sh "$DEST" | cut -f1))"
# TESTE DE RESTAURAÇÃO (faça pelo menos uma vez, em outra máquina/banco de teste):
#   gpg --decrypt db-AAAAMMDD-HHMMSS.sql.gz.gpg | gunzip | mysql -u root -p atm_db_teste
