#!/usr/bin/env bash
# Backup diário do Postgres do app Conecta (+ Redis AOF opcional metadata).
set -euo pipefail

RETENTION_DAYS="${RETENTION_DAYS:-14}"
BACKUP_ROOT="${BACKUP_ROOT:-/var/backups/conecta}"
STAMP="$(date +%Y%m%d_%H%M%S)"
DEST="${BACKUP_ROOT}/${STAMP}"
LOG="${BACKUP_ROOT}/backup.log"

mkdir -p "${DEST}"
exec >>"${LOG}" 2>&1

echo "[$(date -Is)] Início backup → ${DEST}"

# Carrega credenciais do .env Laravel (sem imprimir).
ENV_FILE="/var/www/html/api/laravel/.env"
if [[ ! -f "${ENV_FILE}" ]]; then
  echo "ERRO: .env não encontrado"
  exit 1
fi

DB_HOST="$(rg -N '^DB_HOST=' "${ENV_FILE}" | cut -d= -f2-)"
DB_PORT="$(rg -N '^DB_PORT=' "${ENV_FILE}" | cut -d= -f2-)"
DB_DATABASE="$(rg -N '^DB_DATABASE=' "${ENV_FILE}" | cut -d= -f2-)"
DB_USERNAME="$(rg -N '^DB_USERNAME=' "${ENV_FILE}" | cut -d= -f2-)"
DB_PASSWORD="$(rg -N '^DB_PASSWORD=' "${ENV_FILE}" | cut -d= -f2-)"

export PGPASSWORD="${DB_PASSWORD}"

docker exec conecta_postgres pg_dump \
  -U "${DB_USERNAME}" \
  -d "${DB_DATABASE}" \
  --no-owner \
  --format=custom \
  --file="/tmp/conecta_${STAMP}.dump"

docker cp "conecta_postgres:/tmp/conecta_${STAMP}.dump" "${DEST}/conecta.dump"
docker exec conecta_postgres rm -f "/tmp/conecta_${STAMP}.dump"

# Metadados úteis (sem segredos).
{
  echo "stamp=${STAMP}"
  echo "database=${DB_DATABASE}"
  echo "host=${DB_HOST}:${DB_PORT}"
  echo "app_env=$(rg -N '^APP_ENV=' "${ENV_FILE}" | cut -d= -f2-)"
  echo "git=$(git -C /var/www/html/api/laravel rev-parse --short HEAD 2>/dev/null || echo n/a)"
} > "${DEST}/meta.txt"

# Compacta pasta do dia
tar -C "${BACKUP_ROOT}" -czf "${BACKUP_ROOT}/conecta_${STAMP}.tar.gz" "${STAMP}"
rm -rf "${DEST}"

# Retenção
find "${BACKUP_ROOT}" -maxdepth 1 -type f -name 'conecta_*.tar.gz' -mtime "+${RETENTION_DAYS}" -delete

unset PGPASSWORD
echo "[$(date -Is)] Backup OK: ${BACKUP_ROOT}/conecta_${STAMP}.tar.gz"
