#!/bin/bash
# ═══════════════════════════════════════════════════════════════════
# Daily PostgreSQL backup for line-monit-back
# Invoked by line-monit-back-backup.timer
# Defaults can be overridden via /etc/default/line-monit-back-backup
# ═══════════════════════════════════════════════════════════════════
set -euo pipefail

DEFAULTS_FILE="/etc/default/line-monit-back-backup"
if [ -f "$DEFAULTS_FILE" ]; then
  # shellcheck disable=SC1090
  . "$DEFAULTS_FILE"
fi

DB_NAME="${DB_NAME:-appdbv2}"
BACKUP_DIR="${BACKUP_DIR:-/var/backups/line-monit-back}"
BACKUP_RETENTION_DAYS="${BACKUP_RETENTION_DAYS:-14}"

if ! [[ "$BACKUP_RETENTION_DAYS" =~ ^[0-9]+$ ]]; then
  echo "ERROR: BACKUP_RETENTION_DAYS must be a non-negative integer" >&2
  exit 1
fi

if ! command -v pg_dump >/dev/null 2>&1; then
  echo "ERROR: pg_dump not found in PATH" >&2
  exit 1
fi

mkdir -p "$BACKUP_DIR"

TIMESTAMP="$(date +%Y%m%d-%H%M%S)"
OUT="${BACKUP_DIR}/${DB_NAME}_${TIMESTAMP}.dump"
TMP="${OUT}.tmp"
trap 'rm -f "$TMP"' EXIT

# Custom format (-Fc) is already compressed and suitable for pg_restore.
pg_dump -Fc -d "$DB_NAME" -f "$TMP"
mv "$TMP" "$OUT"
trap - EXIT
chmod 640 "$OUT" 2>/dev/null || true

# Prune older than BACKUP_RETENTION_DAYS
find "$BACKUP_DIR" -maxdepth 1 -type f -name "${DB_NAME}_*.dump" \
  -mtime "+${BACKUP_RETENTION_DAYS}" -delete

SIZE="$(du -h "$OUT" | cut -f1)"
echo "Backup written: $OUT ($SIZE), retention=${BACKUP_RETENTION_DAYS}d"
