#!/bin/bash
# ============================================================================
# Palworld Proton Docker Server - Entrypoint
# ============================================================================

set -e

# Farben für Logging
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Logging-Funktionen
log_info() { echo -e "${BLUE}[INFO]${NC} $*"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
log_error() { echo -e "${RED}[ERROR]${NC} $*"; }
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $*"; }

log_info "=========================================="
log_info "Palworld Proton Docker Server"
log_info "Proton Version: ${PROTON_VERSION}"
log_info "=========================================="

# ============================================================================
# Umgebungsvariablen mit Defaults
# ============================================================================

# Server-Konfiguration
export SERVER_NAME="${SERVER_NAME:-Palworld Proton Server}"
export SERVER_DESCRIPTION="${SERVER_DESCRIPTION:-Running via Proton on Linux Docker}"
export SERVER_PASSWORD="${SERVER_PASSWORD:-}"
export ADMIN_PASSWORD="${ADMIN_PASSWORD:-admin}"
export MAX_PLAYERS="${MAX_PLAYERS:-32}"
export SERVER_PORT="${SERVER_PORT:-8211}"
export QUERY_PORT="${QUERY_PORT:-27015}"
export RCON_PORT="${RCON_PORT:-25575}"
export RCON_ENABLED="${RCON_ENABLED:-true}"
export REST_API_ENABLED="${REST_API_ENABLED:-true}"
export REST_API_PORT="${REST_API_PORT:-8212}"

# Proton/Steam Konfiguration
export UPDATE_ON_START="${UPDATE_ON_START:-true}"
export VALIDATE_FILES="${VALIDATE_FILES:-true}"
export USE_DEPOT_DOWNLOADER="${USE_DEPOT_DOWNLOADER:-false}"

# Performance-Optionen
export WINE_ESYNC="${WINE_ESYNC:-1}"
export WINE_FSYNC="${WINE_FSYNC:-1}"
export MALLOC_CHECK="${MALLOC_CHECK:-0}"
export PROTON_LOG="${PROTON_LOG:-0}"

# Backup & Wartung
export BACKUP_ENABLED="${BACKUP_ENABLED:-true}"
export BACKUP_INTERVAL="${BACKUP_INTERVAL:-3600}"
export BACKUP_RETENTION="${BACKUP_RETENTION:-7}"
export AUTO_UPDATE="${AUTO_UPDATE:-false}"

# Spiel-Konfiguration (nur Auswahl, weitere in config-manager.sh)
export DIFFICULTY="${DIFFICULTY:-None}"
export DAYTIME_SPEEDRATE="${DAYTIME_SPEEDRATE:-1.0}"
export NIGHTTIME_SPEEDRATE="${NIGHTTIME_SPEEDRATE:-1.0}"
export EXP_RATE="${EXP_RATE:-1.0}"
export PAL_CAPTURE_RATE="${PAL_CAPTURE_RATE:-1.0}"
export DEATH_PENALTY="${DEATH_PENALTY:-All}"
export ENABLE_PVP="${ENABLE_PVP:-false}"
export ENABLE_MULTIPLAY="${ENABLE_MULTIPLAY:-true}"

# ============================================================================
# Verzeichnisse sicherstellen
# ============================================================================

log_info "Erstelle Verzeichnisstruktur..."
mkdir -p "${SERVER_DIR}" "${CONFIG_DIR}" "${BACKUP_DIR}" "${MODS_DIR}"
mkdir -p "${SERVER_DIR}/Pal/Saved/Config/WindowsServer"
mkdir -p "${SERVER_DIR}/Pal/Saved/SaveGames"
mkdir -p "${SERVER_DIR}/Pal/Saved/Logs"

# Berechtigungen korrigieren
chown -R ${USER}:${USER} /opt/palworld

# ============================================================================
# Xvfb (Virtueller Display) starten
# ============================================================================

log_info "Starte virtuellen Display (Xvfb)..."
export DISPLAY=:99
Xvfb :99 -screen 0 1024x768x24 +extension GLX +render -noreset &
XVFB_PID=$!
sleep 2

if ! kill -0 $XVFB_PID 2>/dev/null; then
    log_error "Xvfb konnte nicht gestartet werden!"
    exit 1
fi
log_success "Xvfb läuft auf Display :99 (PID: $XVFB_PID)"

# ============================================================================
# Server-Installation via SteamCMD
# ============================================================================

if [ "${UPDATE_ON_START}" = "true" ]; then
    log_info "Installiere/Update Palworld Dedicated Server via SteamCMD..."
    log_info "AppID: ${STEAM_APP_ID}"
    
    # SteamCMD Befehl zusammenbauen
    STEAMCMD_ARGS="+force_install_dir ${SERVER_DIR} +login anonymous"
    
    if [ "${USE_DEPOT_DOWNLOADER}" = "true" ]; then
        log_warn "Depot-Downloader Modus ist aktiviert (experimentell)"
        # Alternative Download-Methode falls nötig
    fi
    
    STEAMCMD_ARGS="${STEAMCMD_ARGS} +app_update ${STEAM_APP_ID}"
    
    if [ "${VALIDATE_FILES}" = "true" ]; then
        log_info "Datei-Validierung aktiviert..."
        STEAMCMD_ARGS="${STEAMCMD_ARGS} validate"
    fi
    
    STEAMCMD_ARGS="${STEAMCMD_ARGS} +quit"
    
    log_info "Führe SteamCMD aus: ${STEAMCMD_ARGS}"
    
    # SteamCMD als palworld-Benutzer ausführen
    su - ${USER} -c "${STEAMCMD_DIR}/steamcmd.sh ${STEAMCMD_ARGS}" 2>&1 | tee /tmp/steamcmd.log
    
    if [ ${PIPESTATUS[0]} -ne 0 ]; then
        log_error "SteamCMD fehlgeschlagen! Prüfe /tmp/steamcmd.log"
        exit 1
    fi
    
    log_success "Server-Installation abgeschlossen!"
else
    log_warn "UPDATE_ON_START ist deaktiviert, überspringe Installation..."
    
    # Prüfe ob Server existiert
    if [ ! -f "${SERVER_DIR}/PalServer.exe" ]; then
        log_error "PalServer.exe nicht gefunden! Aktiviere UPDATE_ON_START=true für erste Installation."
        exit 1
    fi
fi

# ============================================================================
# Konfiguration generieren
# ============================================================================

log_info "Generiere Server-Konfiguration..."
/opt/palworld/scripts/config-manager.sh

# ============================================================================
# Mod-Support (optional)
# ============================================================================

# Mods-Verzeichnis immer einrichten (für manuelle Mods)
/opt/palworld/scripts/mod-installer.sh --setup

# UE4SS installieren wenn aktiviert
if [ "${INSTALL_UE4SS}" = "true" ]; then
    log_info "UE4SS Installation aktiviert..."
    log_info "Installiere von: https://github.com/UE4SS-RE/RE-UE4SS/releases/tag/experimental-latest"
    if /opt/palworld/scripts/mod-installer.sh --install-ue4ss; then
        log_success "UE4SS erfolgreich installiert!"
        /opt/palworld/scripts/mod-installer.sh --info
    else
        log_error "UE4SS Installation fehlgeschlagen! Fahre ohne Mod-Support fort..."
    fi
elif [ "${ENABLE_MODS}" = "true" ]; then
    log_info "Mod-Unterstützung aktiviert (ohne UE4SS Auto-Install)..."
    log_info "Für UE4SS Auto-Install: INSTALL_UE4SS=true setzen"
fi

# ============================================================================
# Backup-System initialisieren
# ============================================================================

if [ "${BACKUP_ENABLED}" = "true" ]; then
    log_info "Backup-System wird initialisiert..."
    /opt/palworld/scripts/backup-manager.sh --init
fi

# ============================================================================
# Auto-Update Cron (optional)
# ============================================================================

if [ "${AUTO_UPDATE}" = "true" ]; then
    log_info "Auto-Update aktiviert..."
    # Cron-Job für automatische Updates
    echo "0 */6 * * * /opt/palworld/scripts/update-check.sh >> /var/log/palworld-update.log 2>&1" | crontab -
    service cron start || true
fi

# ============================================================================
# Server-Start
# ============================================================================

log_info "=========================================="
log_info "Starte Palworld Dedicated Server..."
log_info "Server Name: ${SERVER_NAME}"
log_info "Max Players: ${MAX_PLAYERS}"
log_info "Ports: Game=${SERVER_PORT}, Query=${QUERY_PORT}, RCON=${RCON_PORT}"
log_info "=========================================="

# Exportiere alle ENV-Variablen für das Start-Skript
export > /tmp/palworld_env

# Server-Prozess starten (durch proton-launcher.sh)
exec /opt/palworld/scripts/proton-launcher.sh
