#!/usr/bin/env bash
# =============================================
#  MinusNow Backup (Linux) v2.5
#  February 2026
# =============================================
# Creates timestamped backup of the MinusNow workspace.
# Optionally includes PostgreSQL database dump and retention policy.
#
# Usage:
#   ./backup-linux.sh [--output-dir ./backups] [--include-deps] [--include-db] [--retain-days 30]

set -euo pipefail

OUTPUT_DIR="${OUTPUT_DIR:-$(pwd)/backups}"
INCLUDE_DEPS=false
INCLUDE_DB=false
PG_DATABASE="${PG_DATABASE:-minusnow}"
RETAIN_DAYS=30

while [[ $# -gt 0 ]]; do
  case "$1" in
    --output-dir)   OUTPUT_DIR="$2"; shift 2 ;;
    --include-deps) INCLUDE_DEPS=true; shift ;;
    --include-db)   INCLUDE_DB=true; shift ;;
    --pg-database)  PG_DATABASE="$2"; shift 2 ;;
    --retain-days)  RETAIN_DAYS="$2"; shift 2 ;;
    *) echo "Unknown arg: $1"; exit 1 ;;
  esac
done

mkdir -p "$OUTPUT_DIR"
TS=$(date +%Y%m%d-%H%M%S)
ROOT_DIR=$(pwd)

echo ""
echo "==> MinusNow Backup (Linux) v2.5"
echo "    Timestamp: $TS"

# --- File Backup ---
FILE_ARCHIVE="$OUTPUT_DIR/minusnow-files-$TS.tar.gz"
echo "    Creating file backup: $FILE_ARCHIVE"

TMP_DIR=$(mktemp -d)

EXCLUDES=(
  ".git" ".vscode" "audit-logs" "support-tickets" "ticket-responses"
)
if [[ "$INCLUDE_DEPS" != "true" ]]; then
  EXCLUDES+=("node_modules" "dist")
fi

RSYNC_EXCLUDE=()
for e in "${EXCLUDES[@]}"; do
  RSYNC_EXCLUDE+=("--exclude=$e")
done

rsync -a --delete "${RSYNC_EXCLUDE[@]}" \
  --exclude='*.log' --exclude='*.tmp' --exclude='founder-credentials.json' \
  "$ROOT_DIR/" "$TMP_DIR/"

# Security: double-check
find "$TMP_DIR" -name "founder-credentials.json" -delete 2>/dev/null || true

tar -czf "$FILE_ARCHIVE" -C "$TMP_DIR" .
rm -rf "$TMP_DIR"
FILE_SIZE=$(du -h "$FILE_ARCHIVE" | awk '{print $1}')
echo "    [OK] File backup: $FILE_SIZE"

# --- Database Backup ---
if [[ "$INCLUDE_DB" == "true" ]]; then
  DB_DUMP="$OUTPUT_DIR/minusnow-db-$TS.sql"
  echo "    Creating database dump: $DB_DUMP"
  if command -v pg_dump >/dev/null 2>&1; then
    sudo -u postgres pg_dump "$PG_DATABASE" > "$DB_DUMP"
    DB_SIZE=$(du -h "$DB_DUMP" | awk '{print $1}')
    echo "    [OK] Database dump: $DB_SIZE"
  else
    echo "    [WARN] pg_dump not found. Skipping database backup."
  fi
fi

# --- Retention Policy ---
if [[ "$RETAIN_DAYS" -gt 0 ]]; then
  OLD_FILES=$(find "$OUTPUT_DIR" -name "minusnow-*" -mtime +$RETAIN_DAYS 2>/dev/null | wc -l)
  if [[ "$OLD_FILES" -gt 0 ]]; then
    echo "    Cleaning backups older than $RETAIN_DAYS days..."
    find "$OUTPUT_DIR" -name "minusnow-*" -mtime +$RETAIN_DAYS -delete
    echo "    [OK] Removed $OLD_FILES old backup(s)"
  fi
fi

echo ""
echo "    Backup complete!"
echo "    Location: $OUTPUT_DIR"
