#!/bin/bash
#
# backup-all.sh - Master backup orchestration script
#
# Runs all backup scripts in sequence with locking to prevent concurrent runs
# Tracks errors and provides a summary at the end
#

set -euo pipefail

# Configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BACKUP_ROOT="$(dirname "$SCRIPT_DIR")"
LOG_FILE="$BACKUP_ROOT/logs/backup.log"
LOCK_FILE="$BACKUP_ROOT/.backup.lock"

# Ensure log directory exists
mkdir -p "$BACKUP_ROOT/logs"

# Logging function
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] [MASTER] $1" | tee -a "$LOG_FILE"
}

# Cleanup function to remove lock file on exit
cleanup() {
    rm -f "$LOCK_FILE"
}

# Check for existing lock (prevent concurrent runs)
if [[ -f "$LOCK_FILE" ]]; then
    # Check if the process holding the lock is still running
    LOCK_PID=$(cat "$LOCK_FILE" 2>/dev/null || echo "")
    if [[ -n "$LOCK_PID" ]] && kill -0 "$LOCK_PID" 2>/dev/null; then
        log "ERROR: Another backup is already running (PID: $LOCK_PID)"
        exit 1
    else
        log "WARNING: Stale lock file found, removing..."
        rm -f "$LOCK_FILE"
    fi
fi

# Create lock file with our PID
echo $$ > "$LOCK_FILE"
trap cleanup EXIT

log "=========================================="
log "Starting backup process"
log "=========================================="

# Track errors
ERRORS=0
ERROR_SCRIPTS=""

# Run database backup
log "Running database backup..."
if "$SCRIPT_DIR/backup-database.sh"; then
    log "Database backup: SUCCESS"
else
    log "Database backup: FAILED"
    ((ERRORS++))
    ERROR_SCRIPTS="$ERROR_SCRIPTS database"
fi

# Run files backup
log "Running files backup..."
if "$SCRIPT_DIR/backup-files.sh"; then
    log "Files backup: SUCCESS"
else
    log "Files backup: FAILED"
    ((ERRORS++))
    ERROR_SCRIPTS="$ERROR_SCRIPTS files"
fi

# Run crontab backup
log "Running crontab backup..."
if "$SCRIPT_DIR/backup-crontab.sh"; then
    log "Crontab backup: SUCCESS"
else
    log "Crontab backup: FAILED"
    ((ERRORS++))
    ERROR_SCRIPTS="$ERROR_SCRIPTS crontab"
fi

# Run cleanup
log "Running cleanup of old backups..."
if "$SCRIPT_DIR/cleanup-old-backups.sh"; then
    log "Cleanup: SUCCESS"
else
    log "Cleanup: FAILED"
    ((ERRORS++))
    ERROR_SCRIPTS="$ERROR_SCRIPTS cleanup"
fi

# Summary
log "=========================================="
if [[ $ERRORS -eq 0 ]]; then
    log "Backup completed successfully"
else
    log "Backup completed with $ERRORS error(s):$ERROR_SCRIPTS"
fi
log "=========================================="

# Report storage usage
TOTAL_SIZE=$(du -sh "$BACKUP_ROOT/storage" 2>/dev/null | cut -f1 || echo "unknown")
log "Total backup storage used: $TOTAL_SIZE"

# List latest backups
log "Latest backups:"
for backup_type in database files crontab; do
    LATEST="$BACKUP_ROOT/storage/$backup_type/latest.*"
    if ls $LATEST 1>/dev/null 2>&1; then
        LATEST_FILE=$(ls -la $LATEST 2>/dev/null | head -1)
        log "  $backup_type: $LATEST_FILE"
    fi
done

# Exit with error code if any backup failed
exit $ERRORS
