#!/bin/bash
set -euo pipefail

# =========================
# Config
# =========================

APP_USER="aorsjgac"

LOCAL_PUBLIC_HTML="/home/aorsjgac/public_html"
MYSQL_BACKUP_DIR="${LOCAL_PUBLIC_HTML}/backups/mysql"

DB_NAME="aorsjgac_spamfilter"

REMOTE_USER="aorsjgac"
REMOTE_HOST="104.168.171.54"
REMOTE_PUBLIC_HTML="/home/aorsjgac/public_html"

RETENTION_DAYS="7"

# Set to 1 for first safe test.
DRY_RUN="0"

# =========================
# Safety checks
# =========================

if [ ! -d "$LOCAL_PUBLIC_HTML" ]; then
    echo "ERROR: local public_html not found: $LOCAL_PUBLIC_HTML"
    exit 1
fi

mkdir -p "$MYSQL_BACKUP_DIR"

# =========================
# 1. MySQL dump into mirrored tree
# =========================

TS="$(date +%F_%H%M%S)"
TMP_FILE="${MYSQL_BACKUP_DIR}/${DB_NAME}_${TS}.sql.gz.tmp"
OUT_FILE="${MYSQL_BACKUP_DIR}/${DB_NAME}_${TS}.sql.gz"

echo "Creating MySQL dump: $OUT_FILE"

mysqldump \
    --single-transaction \
    --quick \
    --routines \
    --triggers \
    --events \
    --default-character-set=utf8mb4 \
    "$DB_NAME" \
| gzip -9 > "$TMP_FILE"

mv "$TMP_FILE" "$OUT_FILE"

chown "$APP_USER:$APP_USER" "$OUT_FILE"
chmod 600 "$OUT_FILE"

# =========================
# 2. Local rotation
# =========================

echo "Rotating local MySQL dumps older than ${RETENTION_DAYS} days"

find "$MYSQL_BACKUP_DIR" \
    -type f \
    -name "${DB_NAME}_*.sql.gz" \
    -mtime +"$RETENTION_DAYS" \
    -delete

# Guard: do not rsync --delete if backup dir became empty.
DUMP_COUNT="$(find "$MYSQL_BACKUP_DIR" -type f -name "${DB_NAME}_*.sql.gz" | wc -l)"

if [ "$DUMP_COUNT" -lt 1 ]; then
    echo "ERROR: no MySQL dump files found after rotation; refusing rsync --delete"
    exit 1
fi

# =========================
# 3. Rsync filesystem mirror
# =========================

RSYNC_FLAGS="-az --delete --partial --delay-updates"

if [ "$DRY_RUN" = "1" ]; then
    RSYNC_FLAGS="-azn --delete --partial --delay-updates"
    echo "DRY RUN enabled: rsync will not change remote files"
fi

echo "Mirroring public_html to ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PUBLIC_HTML}/"

rsync $RSYNC_FLAGS \
    "${LOCAL_PUBLIC_HTML}/" \
    "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PUBLIC_HTML}/"

echo "Done"