#!/bin/bash

# =============================================================================
# TimeClock v3 - Automatisches Backup-Script
# =============================================================================
# Erstellt tägliche Backups der Datenbank und optional des Codes
#
# Installation:
#   sudo cp backup-timeclock.sh /usr/local/bin/
#   sudo chmod +x /usr/local/bin/backup-timeclock.sh
#
# Cronjob einrichten (täglich um 2 Uhr):
#   sudo crontab -e
#   0 2 * * * /usr/local/bin/backup-timeclock.sh >> /var/log/timeclock/backup.log 2>&1
#
# Manuell ausführen:
#   /usr/local/bin/backup-timeclock.sh
# =============================================================================

set -e

# Konfiguration
BACKUP_DIR="/var/backups/timeclock"
PROJECT_DIR="/var/www/timeclock"
ENV_FILE="$PROJECT_DIR/backend/.env"
RETENTION_DAYS=30  # Backups älter als X Tage werden gelöscht

# Datum
DATE=$(date +%Y%m%d_%H%M%S)
DATE_READABLE=$(date '+%Y-%m-%d %H:%M:%S')

# Logging
log() {
    echo "[${DATE_READABLE}] $1"
}

log_error() {
    echo "[${DATE_READABLE}] ERROR: $1" >&2
}

# =============================================================================
# Voraussetzungen prüfen
# =============================================================================

if [ ! -f "$ENV_FILE" ]; then
    log_error ".env Datei nicht gefunden: $ENV_FILE"
    exit 1
fi

# Backup-Verzeichnis erstellen
mkdir -p "$BACKUP_DIR"

# =============================================================================
# Datenbank-Credentials aus .env lesen
# =============================================================================

log "Lese Datenbank-Konfiguration..."

# Funktion zum Auslesen von .env Werten
get_env_value() {
    grep "^$1=" "$ENV_FILE" | cut -d '=' -f2- | tr -d '"' | tr -d "'"
}

DB_HOST=$(get_env_value "DB_HOST")
DB_PORT=$(get_env_value "DB_PORT")
DB_NAME=$(get_env_value "DB_NAME")
DB_USER=$(get_env_value "DB_USER")
DB_PASSWORD=$(get_env_value "DB_PASSWORD")

# Defaults setzen
DB_HOST=${DB_HOST:-localhost}
DB_PORT=${DB_PORT:-3306}

if [ -z "$DB_NAME" ] || [ -z "$DB_USER" ] || [ -z "$DB_PASSWORD" ]; then
    log_error "Datenbank-Credentials unvollständig in .env"
    exit 1
fi

log "Datenbank: $DB_USER@$DB_HOST:$DB_PORT/$DB_NAME"

# =============================================================================
# Datenbank-Backup erstellen
# =============================================================================

log "Erstelle Datenbank-Backup..."

BACKUP_FILE="$BACKUP_DIR/timeclock_db_$DATE.sql.gz"

# mysqldump mit Kompression
if mysqldump \
    --host="$DB_HOST" \
    --port="$DB_PORT" \
    --user="$DB_USER" \
    --password="$DB_PASSWORD" \
    --single-transaction \
    --routines \
    --triggers \
    --events \
    --add-drop-database \
    --databases "$DB_NAME" \
    | gzip > "$BACKUP_FILE"; then
    
    # Dateigröße ermitteln
    SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
    log "✅ Datenbank-Backup erfolgreich erstellt: $BACKUP_FILE ($SIZE)"
else
    log_error "Datenbank-Backup fehlgeschlagen!"
    exit 1
fi

# =============================================================================
# Code-Backup erstellen (optional)
# =============================================================================

BACKUP_CODE=false  # Auf true setzen für Code-Backups

if [ "$BACKUP_CODE" = true ]; then
    log "Erstelle Code-Backup..."
    
    CODE_BACKUP_FILE="$BACKUP_DIR/timeclock_code_$DATE.tar.gz"
    
    if tar -czf "$CODE_BACKUP_FILE" \
        -C "$(dirname $PROJECT_DIR)" \
        --exclude="node_modules" \
        --exclude="dist" \
        --exclude=".git" \
        --exclude="*.log" \
        "$(basename $PROJECT_DIR)"; then
        
        SIZE=$(du -h "$CODE_BACKUP_FILE" | cut -f1)
        log "✅ Code-Backup erfolgreich erstellt: $CODE_BACKUP_FILE ($SIZE)"
    else
        log_error "Code-Backup fehlgeschlagen!"
    fi
fi

# =============================================================================
# Alte Backups löschen
# =============================================================================

log "Lösche alte Backups (älter als $RETENTION_DAYS Tage)..."

# Datenbank-Backups
DELETED_DB=$(find "$BACKUP_DIR" -name "timeclock_db_*.sql.gz" -mtime +$RETENTION_DAYS -type f -delete -print | wc -l)
if [ "$DELETED_DB" -gt 0 ]; then
    log "🗑️  $DELETED_DB alte Datenbank-Backups gelöscht"
fi

# Code-Backups
if [ "$BACKUP_CODE" = true ]; then
    DELETED_CODE=$(find "$BACKUP_DIR" -name "timeclock_code_*.tar.gz" -mtime +$RETENTION_DAYS -type f -delete -print | wc -l)
    if [ "$DELETED_CODE" -gt 0 ]; then
        log "🗑️  $DELETED_CODE alte Code-Backups gelöscht"
    fi
fi

# =============================================================================
# Backup-Statistik
# =============================================================================

log "Backup-Statistik:"
log "  📊 Gesamt-Backups: $(ls -1 $BACKUP_DIR/timeclock_db_*.sql.gz 2>/dev/null | wc -l)"
log "  💾 Gesamtgröße: $(du -sh $BACKUP_DIR | cut -f1)"
log "  📅 Ältestes Backup: $(ls -t $BACKUP_DIR/timeclock_db_*.sql.gz 2>/dev/null | tail -1 | xargs basename)"
log "  📅 Neuestes Backup: $(ls -t $BACKUP_DIR/timeclock_db_*.sql.gz 2>/dev/null | head -1 | xargs basename)"

# =============================================================================
# Optional: Backup an Remote-Server senden
# =============================================================================

REMOTE_BACKUP=false  # Auf true setzen für Remote-Backup
REMOTE_USER="backup"
REMOTE_HOST="backup.example.com"
REMOTE_PATH="/backups/timeclock"

if [ "$REMOTE_BACKUP" = true ]; then
    log "Sende Backup an Remote-Server..."
    
    if rsync -az --progress "$BACKUP_FILE" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH/"; then
        log "✅ Remote-Backup erfolgreich"
    else
        log_error "Remote-Backup fehlgeschlagen!"
    fi
fi

# =============================================================================
# Optional: Backup-Benachrichtigung per E-Mail
# =============================================================================

SEND_EMAIL=false  # Auf true setzen für E-Mail-Benachrichtigung
EMAIL_TO="admin@tsschulz.de"

if [ "$SEND_EMAIL" = true ] && command -v mail &> /dev/null; then
    log "Sende E-Mail-Benachrichtigung..."
    
    SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
    
    echo "TimeClock Backup erfolgreich erstellt

Datum: $DATE_READABLE
Datei: $BACKUP_FILE
Größe: $SIZE
Datenbank: $DB_NAME

Backup-Verzeichnis: $BACKUP_DIR
Anzahl Backups: $(ls -1 $BACKUP_DIR/timeclock_db_*.sql.gz 2>/dev/null | wc -l)
Gesamtgröße: $(du -sh $BACKUP_DIR | cut -f1)

--
TimeClock v3 Backup System
" | mail -s "✅ TimeClock Backup erfolgreich ($DATE)" "$EMAIL_TO"
    
    log "📧 E-Mail gesendet an $EMAIL_TO"
fi

# =============================================================================
# Fertig
# =============================================================================

log "✅ Backup-Prozess abgeschlossen!"

exit 0

