#!/bin/bash
# Makenotwork Database Backup Script
# Runs daily via cron, keeps 30 days of backups.
#
# Setup:
#   1. Copy to server:
#      scp deploy/backup-db.sh root@<server>:/opt/makenotwork/
#      chmod +x /opt/makenotwork/backup-db.sh
#
#   2. Create backup directory:
#      mkdir -p /opt/makenotwork/backups
#      chown makenotwork:makenotwork /opt/makenotwork/backups
#
#   3. Add cron job (as makenotwork user):
#      sudo crontab -u makenotwork -e
#      # Daily at 03:00 UTC:
#      0 3 * * * /opt/makenotwork/backup-db.sh >> /opt/makenotwork/backups/backup.log 2>&1

set -euo pipefail

# Configuration
BACKUP_DIR="/opt/makenotwork/backups"
DB_NAME="makenotwork"
DB_USER="makenotwork"
RETENTION_DAYS=30

# Derived
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}-${TIMESTAMP}.sql.gz"

echo "[$(date -Iseconds)] Starting backup..."

# Ensure backup directory exists
mkdir -p "$BACKUP_DIR"

# Dump and compress
# Uses peer auth (no password needed when running as makenotwork user)
pg_dump -U "$DB_USER" "$DB_NAME" | gzip > "$BACKUP_FILE"

# Verify the file is non-empty
FILESIZE=$(stat -c%s "$BACKUP_FILE" 2>/dev/null || stat -f%z "$BACKUP_FILE" 2>/dev/null)
if [ "$FILESIZE" -lt 100 ]; then
    echo "[$(date -Iseconds)] ERROR: Backup file suspiciously small (${FILESIZE} bytes)"
    exit 1
fi

echo "[$(date -Iseconds)] Backup complete: $BACKUP_FILE ($(du -h "$BACKUP_FILE" | cut -f1))"

# Prune backups older than retention period
DELETED=$(find "$BACKUP_DIR" -name "${DB_NAME}-*.sql.gz" -mtime +${RETENTION_DAYS} -delete -print | wc -l)
if [ "$DELETED" -gt 0 ]; then
    echo "[$(date -Iseconds)] Pruned $DELETED backup(s) older than ${RETENTION_DAYS} days"
fi

# Summary
TOTAL=$(find "$BACKUP_DIR" -name "${DB_NAME}-*.sql.gz" | wc -l)
echo "[$(date -Iseconds)] Total backups on disk: $TOTAL"

# Sync to offsite host (best-effort — failure here does not fail the backup)
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
OFFSITE_SCRIPT="${SCRIPT_DIR}/sync-backup-offsite.sh"
if [ -x "$OFFSITE_SCRIPT" ]; then
    "$OFFSITE_SCRIPT"
else
    # Fallback: check deployed location
    if [ -x /opt/makenotwork/sync-backup-offsite.sh ]; then
        /opt/makenotwork/sync-backup-offsite.sh
    fi
fi
