#!/usr/bin/env bash
# ═══════════════════════════════════════════════════════════════════════
# DB-06: Automated PostgreSQL Backup Script
# PT. Sarana Gemilang Finance System
#
# Usage:
#   chmod +x scripts/backup.sh
#   ./scripts/backup.sh
#
# Cron setup (daily at 2 AM):
#   0 2 * * * /path/to/backend/scripts/backup.sh >> /var/log/sg-backup.log 2>&1
#
# Windows Task Scheduler:
#   pg_dump -U postgres -d sarana_gemilang -F c -f backups\sg_backup_%date%.dump
# ═══════════════════════════════════════════════════════════════════════

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BACKEND_DIR="$(dirname "$SCRIPT_DIR")"
BACKUP_DIR="$BACKEND_DIR/backups"
RETENTION_DAYS=90

# Load .env for DATABASE_URL
if [ -f "$BACKEND_DIR/.env" ]; then
  export $(grep -v '^#' "$BACKEND_DIR/.env" | xargs)
fi

# Extract connection details from DATABASE_URL
# Format: postgresql://user:pass@host:port/dbname
DB_URL="${DATABASE_URL:-}"
if [ -z "$DB_URL" ]; then
  echo "ERROR: DATABASE_URL not set"
  exit 1
fi

# Create backup directory
mkdir -p "$BACKUP_DIR"

TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/sg_backup_${TIMESTAMP}.dump"

echo "════════════════════════════════════════════════════════════"
echo "Starting backup: $(date)"
echo "Output: $BACKUP_FILE"

# Use pg_dump with custom format (compressed)
pg_dump "$DB_URL" \
  --format=custom \
  --compress=9 \
  --no-owner \
  --no-privileges \
  --file="$BACKUP_FILE"

if [ $? -eq 0 ]; then
  SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
  echo "✅ Backup completed: $BACKUP_FILE ($SIZE)"
else
  echo "❌ Backup FAILED"
  exit 1
fi

# Cleanup old backups (> RETENTION_DAYS)
echo "Cleaning backups older than $RETENTION_DAYS days..."
DELETED=$(find "$BACKUP_DIR" -name "sg_backup_*.dump" -mtime +$RETENTION_DAYS -delete -print | wc -l)
echo "Deleted $DELETED old backup(s)"

echo "════════════════════════════════════════════════════════════"
echo "Backup complete: $(date)"
