#!/bin/bash
# ============================================================================
# Palworld Backup Manager
# Automatische Backups mit Retention
# ============================================================================

set -e

# Logging
log_info() { echo "[BACKUP] $*"; }
log_warn() { echo "[BACKUP-WARN] $*"; }
log_error() { echo "[BACKUP-ERROR] $*"; }

# Pfade
SAVEGAMES_DIR="${SERVER_DIR}/Pal/Saved/SaveGames"
CONFIGS_DIR="${SERVER_DIR}/Pal/Saved/Config"

# ============================================================================
# Hilfsfunktionen
# ============================================================================

get_timestamp() {
    date +"%Y%m%d_%H%M%S"
}

create_backup() {
    local backup_name="backup_$(get_timestamp).tar.gz"
    local backup_path="${BACKUP_DIR}/${backup_name}"
    
    log_info "Erstelle Backup: ${backup_name}"
    
    # Sicherstellen dass Verzeichnisse existieren
    mkdir -p "${SAVEGAMES_DIR}" 2>/dev/null || true
    
    # Backup erstellen (SaveGames + Configs)
    if [ -d "${SAVEGAMES_DIR}" ]; then
        tar -czf "${backup_path}" -C "${SERVER_DIR}/Pal/Saved" SaveGames Config 2>/dev/null || {
            log_warn "Konnte nicht alles sichern, versuche nur SaveGames..."
            if [ -d "${SAVEGAMES_DIR}" ]; then
                tar -czf "${backup_path}" -C "${SERVER_DIR}/Pal/Saved" SaveGames 2>/dev/null || {
                    log_error "Backup fehlgeschlagen!"
                    return 1
                }
            fi
        }
    else
        log_warn "SaveGames-Verzeichnis nicht gefunden, überspringe Backup"
        return 1
    fi
    
    # Berechtigungen setzen
    chown ${USER}:${USER} "${backup_path}"
    
    local size=$(du -h "${backup_path}" | cut -f1)
    log_success "Backup erstellt: ${backup_name} (${size})"
    
    return 0
}

cleanup_old_backups() {
    local retention_days="${BACKUP_RETENTION:-7}"
    
    log_info "Bereinige alte Backups (älter als ${retention_days} Tage)..."
    
    local count_before=$(ls -1 "${BACKUP_DIR}"/backup_*.tar.gz 2>/dev/null | wc -l)
    
    # Alte Backups löschen
    find "${BACKUP_DIR}" -name "backup_*.tar.gz" -mtime +${retention_days} -delete 2>/dev/null || true
    
    local count_after=$(ls -1 "${BACKUP_DIR}"/backup_*.tar.gz 2>/dev/null | wc -l)
    local deleted=$((count_before - count_after))
    
    if [ $deleted -gt 0 ]; then
        log_info "${deleted} alte Backups gelöscht"
    else
        log_info "Keine alten Backups zum Löschen gefunden"
    fi
}

list_backups() {
    log_info "Verfügbare Backups:"
    
    if [ -d "${BACKUP_DIR}" ]; then
        ls -lah "${BACKUP_DIR}"/backup_*.tar.gz 2>/dev/null | while read line; do
            echo "  ${line}"
        done || echo "  Keine Backups vorhanden"
    else
        echo "  Backup-Verzeichnis existiert nicht"
    fi
}

restore_backup() {
    local backup_file="$1"
    
    if [ -z "${backup_file}" ]; then
        log_error "Keine Backup-Datei angegeben!"
        log_info "Verfügbare Backups:"
        ls -1 "${BACKUP_DIR}"/backup_*.tar.gz 2>/dev/null || echo "Keine Backups vorhanden"
        return 1
    fi
    
    local full_path="${BACKUP_DIR}/${backup_file}"
    
    if [ ! -f "${full_path}" ]; then
        log_error "Backup-Datei nicht gefunden: ${full_path}"
        return 1
    fi
    
    log_warn "=========================================="
    log_warn "RESTORE MODUS"
    log_warn "Dies wird aktuelle SaveGames überschreiben!"
    log_warn "=========================================="
    
    # Aktuelle Saves backupen vor Restore
    local safety_backup="pre_restore_$(get_timestamp).tar.gz"
    tar -czf "${BACKUP_DIR}/${safety_backup}" -C "${SERVER_DIR}/Pal/Saved" SaveGames 2>/dev/null || true
    log_info "Sicherheits-Backup erstellt: ${safety_backup}"
    
    # Restore durchführen
    log_info "Stelle Backup wieder her: ${backup_file}"
    
    # Lösche aktuelle SaveGames
    rm -rf "${SAVEGAMES_DIR}"/* 2>/dev/null || true
    
    # Extrahiere Backup
    tar -xzf "${full_path}" -C "${SERVER_DIR}/Pal/Saved" 2>/dev/null || {
        log_error "Wiederherstellung fehlgeschlagen!"
        return 1
    }
    
    # Berechtigungen korrigieren
    chown -R ${USER}:${USER} "${SAVEGAMES_DIR}" 2>/dev/null || true
    
    log_success "Backup erfolgreich wiederhergestellt!"
    log_warn "Bitte Server neu starten um wiederhergestellte Daten zu laden!"
}

# ============================================================================
# Initialisierung
# ============================================================================

init_backup_system() {
    log_info "Initialisiere Backup-System..."
    
    # Backup-Verzeichnis erstellen
    mkdir -p "${BACKUP_DIR}"
    chown ${USER}:${USER} "${BACKUP_DIR}"
    
    # Cron-Job für automatische Backups einrichten
    local interval_minutes=$((BACKUP_INTERVAL / 60))
    
    if [ "${BACKUP_ENABLED}" = "true" ] && command -v crond >/dev/null 2>&1; then
        log_info "Richte automatische Backups ein (alle ${interval_minutes} Minuten)..."
        
        # Erstelle Cron-Eintrag
        echo "*/${interval_minutes} * * * * /opt/palworld/scripts/backup-manager.sh --create >> /var/log/palworld-backup.log 2>&1" | crontab - 2>/dev/null || {
            log_warn "Konnte Cron-Job nicht einrichten. Manuelle Backups mit --create möglich."
        }
        
        # Starte cron falls verfügbar
        if [ -f /etc/init.d/cron ]; then
            service cron start 2>/dev/null || true
        fi
    fi
    
    log_info "Backup-System initialisiert."
    log_info "Backup-Verzeichnis: ${BACKUP_DIR}"
}

# ============================================================================
# Hauptlogik
# ============================================================================

case "${1:-}" in
    --init)
        init_backup_system
        ;;
    --create|-c)
        create_backup
        ;;
    --list|-l)
        list_backups
        ;;
    --cleanup)
        cleanup_old_backups
        ;;
    --restore|-r)
        restore_backup "$2"
        ;;
    --help|-h|*)
        echo "Palworld Backup Manager"
        echo ""
        echo "Verwendung:"
        echo "  --init        - Backup-System initialisieren"
        echo "  --create, -c  - Backup jetzt erstellen"
        echo "  --list, -l    - Verfügbare Backups anzeigen"
        echo "  --cleanup     - Alte Backups bereinigen"
        echo "  --restore, -r [DATEI] - Backup wiederherstellen"
        echo ""
        echo "Umgebungsvariablen:"
        echo "  BACKUP_ENABLED=${BACKUP_ENABLED:-true}"
        echo "  BACKUP_INTERVAL=${BACKUP_INTERVAL:-3600} (Sekunden)"
        echo "  BACKUP_RETENTION=${BACKUP_RETENTION:-7} (Tage)"
        ;;
esac
