#!/usr/bin/env bash
# Daily backup of bw-plugins dev + dist sites to NAS.
# Runs from cron. Logs to /srv/.logging/bw-plugins-backup.log.
#
# Backups:
#   - Dev site project directory (excluding WP core, uploads managed by WP, caches)
#   - Dist site project directory
#   - Dev site database dump
#   - Dist site database dump
#
# Retention:
#   - Daily snapshots kept 14 days
#   - Weekly snapshot on Sundays kept 12 weeks
#   - Monthly snapshot on 1st kept 12 months

set -euo pipefail

BACKUP_ROOT="/mnt/noah/central/Backups/bw-plugins"
LOG_FILE="/srv/.logging/bw-plugins-backup.log"
DATE=$(date +%Y-%m-%d)
WEEK=$(date +%Y-W%V)
MONTH=$(date +%Y-%m)
DOW=$(date +%u)  # 1=Mon, 7=Sun
DOM=$(date +%d)

log() { printf '[%s] %s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$*" >> "$LOG_FILE"; }

log "=== Starting backup ==="

# Touch the NAS path to trigger autofs mount.
ls "$BACKUP_ROOT" > /dev/null 2>&1 || mkdir -p "$BACKUP_ROOT"

daily_dir="${BACKUP_ROOT}/daily/${DATE}"
mkdir -p "$daily_dir"

# --- Dev site ---
log "Backing up bw-plugins dev site..."
rsync -rltD --delete --no-owner --no-group \
	--exclude='wp-admin/' \
	--exclude='wp-includes/' \
	--exclude='wp-content/uploads/cache/' \
	--exclude='wp-content/cache/' \
	--exclude='wp-content/upgrade/' \
	--exclude='.releases/*/source-snapshot.tar.gz' \
	/srv/apps/bw-plugins/ "${daily_dir}/bw-plugins/" 2>>"$LOG_FILE" || log "rsync dev failed: $?"

# --- Dist site ---
log "Backing up bw-plugins-dist site..."
rsync -rltD --delete --no-owner --no-group \
	--exclude='wp-admin/' \
	--exclude='wp-includes/' \
	--exclude='wp-content/uploads/cache/' \
	--exclude='wp-content/cache/' \
	--exclude='wp-content/upgrade/' \
	/srv/apps/bw-plugins-dist/ "${daily_dir}/bw-plugins-dist/" 2>>"$LOG_FILE" || log "rsync dist failed: $?"

# --- Databases ---
log "Dumping databases..."
for proj in bw-plugins bw-plugins-dist; do
	envf="/srv/apps/${proj}/.env"
	if [[ -f "$envf" ]]; then
		db=$(grep ^DB_NAME "$envf" | cut -d= -f2)
		usr=$(grep ^DB_USER "$envf" | cut -d= -f2)
		pwd=$(grep ^DB_PASSWORD "$envf" | cut -d= -f2)
		if mysqldump -h 127.0.0.1 -u "$usr" -p"$pwd" "$db" 2>>"$LOG_FILE" | gzip > "${daily_dir}/${db}.sql.gz"; then
			size=$(stat -c%s "${daily_dir}/${db}.sql.gz")
			log "  ${db}: ${size} bytes"
		else
			log "  ${db}: DUMP FAILED"
		fi
	fi
done

# --- Rotations ---
log "Rotating daily backups (keep 14 days)..."
find "${BACKUP_ROOT}/daily" -maxdepth 1 -type d -mtime +14 -exec rm -rf {} + 2>>"$LOG_FILE" || true

# Weekly: copy Sunday's daily to weekly, keep 12
if [[ "$DOW" == "7" ]]; then
	log "Creating weekly snapshot for ${WEEK}"
	mkdir -p "${BACKUP_ROOT}/weekly"
	rsync -rltD --no-owner --no-group --link-dest="${daily_dir}" "${daily_dir}/" "${BACKUP_ROOT}/weekly/${WEEK}/" 2>>"$LOG_FILE" || true
	find "${BACKUP_ROOT}/weekly" -maxdepth 1 -type d -mtime +90 -exec rm -rf {} + 2>>"$LOG_FILE" || true
fi

# Monthly: copy 1st of month's daily, keep 12
if [[ "$DOM" == "01" ]]; then
	log "Creating monthly snapshot for ${MONTH}"
	mkdir -p "${BACKUP_ROOT}/monthly"
	rsync -rltD --no-owner --no-group --link-dest="${daily_dir}" "${daily_dir}/" "${BACKUP_ROOT}/monthly/${MONTH}/" 2>>"$LOG_FILE" || true
	find "${BACKUP_ROOT}/monthly" -maxdepth 1 -type d -mtime +400 -exec rm -rf {} + 2>>"$LOG_FILE" || true
fi

log "=== Backup complete ==="
