#!/bin/bash
# Sync database backups to offsite host (astra) via Tailscale.
# Called by backup-db.sh after each successful backup.
#
# Setup on astra:
#   mkdir -p /opt/backups/mnw
#
# Setup on Hetzner (as makenotwork user):
#   Ensure SSH key-based auth to astra is configured:
#     ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N ""
#     ssh-copy-id max@100.106.221.39
#   Test: ssh max@100.106.221.39 "echo ok"

set -euo pipefail

OFFSITE_HOST="100.106.221.39"  # astra (Tailscale IP)
OFFSITE_USER="max"
OFFSITE_DIR="/opt/backups/mnw"
BACKUP_DIR="/opt/makenotwork/backups"
DB_NAME="makenotwork"
OFFSITE_RETENTION_DAYS=30
WAM_URL="${WAM_URL:-http://127.0.0.1:7890}"

# Open a WAM ticket for offsite backup failures.
wam_alert() {
    local title="$1"
    local body="${2:-}"
    curl -sf -X POST "$WAM_URL/tickets" \
        -H "Content-Type: application/json" \
        -d "{\"title\": \"$title\", \"body\": \"$body\", \"priority\": \"high\", \"source\": \"backup-offsite\"}" \
        >/dev/null 2>&1 || true
}

# Find the most recent backup
LATEST=$(ls -t "${BACKUP_DIR}/${DB_NAME}"-*.sql.gz 2>/dev/null | head -1)
if [ -z "$LATEST" ]; then
    echo "[$(date -Iseconds)] OFFSITE: No backups found to sync"
    exit 0
fi

echo "[$(date -Iseconds)] OFFSITE: Syncing $(basename "$LATEST") to ${OFFSITE_HOST}:${OFFSITE_DIR}"

# Transfer with compression (already gzipped, so -z won't help much, but
# rsync handles partial transfers and resume on failure)
if rsync -e "ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=accept-new" \
    --timeout=120 \
    "$LATEST" \
    "${OFFSITE_USER}@${OFFSITE_HOST}:${OFFSITE_DIR}/"; then
    echo "[$(date -Iseconds)] OFFSITE: Transfer complete"
else
    echo "[$(date -Iseconds)] OFFSITE: Transfer FAILED (astra unreachable or SSH error)"
    wam_alert "Offsite backup sync failed" "rsync to ${OFFSITE_HOST}:${OFFSITE_DIR} failed for $(basename "$LATEST"). Check Tailscale connectivity and SSH auth."
    exit 0
fi

# Prune old offsite backups
DELETED=$(ssh -o ConnectTimeout=10 "${OFFSITE_USER}@${OFFSITE_HOST}" \
    "find ${OFFSITE_DIR} -name '${DB_NAME}-*.sql.gz' -mtime +${OFFSITE_RETENTION_DAYS} -delete -print 2>/dev/null | wc -l" \
    2>/dev/null || echo "0")
if [ "$DELETED" -gt 0 ]; then
    echo "[$(date -Iseconds)] OFFSITE: Pruned ${DELETED} backup(s) older than ${OFFSITE_RETENTION_DAYS} days"
fi

TOTAL=$(ssh -o ConnectTimeout=10 "${OFFSITE_USER}@${OFFSITE_HOST}" \
    "ls ${OFFSITE_DIR}/${DB_NAME}-*.sql.gz 2>/dev/null | wc -l" \
    2>/dev/null || echo "?")
echo "[$(date -Iseconds)] OFFSITE: Total backups on astra: ${TOTAL}"
