#!/usr/bin/env bash
#
# Backs up the PostgreSQL database and uploaded model artifacts.
# Intended to run via cron, e.g. daily at 2am:
#   0 2 * * * /opt/crop-ai-system/deployment/scripts/backup.sh >> /opt/crop-ai-system/logs/backup.log 2>&1
#
# Keeps the last 14 daily backups locally. For real production
# durability, also sync BACKUP_DIR to off-server storage (e.g. an
# object storage bucket) — that step is intentionally left as a
# client/infra decision since it depends on what's available on their
# VPS provider, and is noted in docs/deployment.md.

set -euo pipefail

BACKUP_DIR="/opt/crop-ai-system/backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=14

mkdir -p "$BACKUP_DIR"

echo "[$TIMESTAMP] Starting backup..."

# Database dump
source /opt/crop-ai-system/.env 2>/dev/null || true
DB_BACKUP_FILE="$BACKUP_DIR/db_${TIMESTAMP}.sql.gz"
pg_dump "${DATABASE_URL/+asyncpg/}" | gzip > "$DB_BACKUP_FILE"
echo "[$TIMESTAMP] Database backed up to $DB_BACKUP_FILE"

# Model artifacts
MODELS_BACKUP_FILE="$BACKUP_DIR/models_${TIMESTAMP}.tar.gz"
tar -czf "$MODELS_BACKUP_FILE" -C /opt/crop-ai-system/data models/v1
echo "[$TIMESTAMP] Model artifacts backed up to $MODELS_BACKUP_FILE"

# Cleanup old backups
find "$BACKUP_DIR" -name "db_*.sql.gz" -mtime +"$RETENTION_DAYS" -delete
find "$BACKUP_DIR" -name "models_*.tar.gz" -mtime +"$RETENTION_DAYS" -delete
echo "[$TIMESTAMP] Cleaned up backups older than $RETENTION_DAYS days"

echo "[$TIMESTAMP] Backup complete"
