#!/bin/bash
# ============================================================================
# Palworld Proton Launcher
# Startet PalServer.exe via Proton-GE
# ============================================================================

set -e

# Farben
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

log_info() { echo -e "${BLUE}[PROTON]${NC} $*"; }
log_warn() { echo -e "${YELLOW}[PROTON]${NC} $*"; }
log_error() { echo -e "${RED}[PROTON]${NC} $*"; }
log_success() { echo -e "${GREEN}[PROTON]${NC} $*"; }

log_info "=========================================="
log_info "Proton-GE Launcher"
log_info "=========================================="

# ============================================================================
# Pfade & Variablen
# ============================================================================

# Proton finden
PROTON_PATH="${PROTON_DIR}/${PROTON_VERSION}"
if [ ! -d "${PROTON_PATH}" ]; then
    # Fallback: Suche nach Proton-Version
    PROTON_PATH=$(find ${PROTON_DIR} -maxdepth 1 -type d -name "GE-Proton*" | head -1)
    if [ -z "${PROTON_PATH}" ]; then
        log_error "Proton-GE nicht gefunden in ${PROTON_DIR}"
        exit 1
    fi
fi

log_info "Proton-Pfad: ${PROTON_PATH}"

# PalServer.exe prüfen
PALSERVER_EXE="${SERVER_DIR}/PalServer.exe"
if [ ! -f "${PALSERVER_EXE}" ]; then
    log_error "PalServer.exe nicht gefunden: ${PALSERVER_EXE}"
    log_error "Server scheint nicht installiert zu sein."
    exit 1
fi

log_success "PalServer.exe gefunden: ${PALSERVER_EXE}"

# ============================================================================
# Wine/Proton Umgebung einrichten
# ============================================================================

log_info "Richte Wine/Proton Umgebung ein..."

# Display für Xvfb
export DISPLAY=:99

# Wine Performance-Optionen
export WINEDEBUG="${WINEDEBUG:--all}"
export WINEESYNC="${WINE_ESYNC:-1}"
export WINEFSYNC="${WINE_FSYNC:-1}"

# Proton Logging (deaktiviert für Produktion)
export PROTON_LOG="${PROTON_LOG:-0}"

# Malloc Check deaktivieren für Stabilität
export MALLOC_CHECK_="${MALLOC_CHECK:-0}"

# Steam Umgebung (für Proton)
export STEAM_COMPAT_CLIENT_INSTALL_PATH="${STEAMCMD_DIR}"
export STEAM_COMPAT_DATA_PATH="${SERVER_DIR}/steam_compat"
mkdir -p "${STEAM_COMPAT_DATA_PATH}"

# Proton-Tool-Pfad
export STEAM_RUNTIME=0

# Windows-Pfade für Proton
WIN_SERVER_DIR="Z:${SERVER_DIR}"

# ============================================================================
# Server-Argumente zusammenbauen
# ============================================================================

log_info "Baue Server-Argumente..."

SERVER_ARGS=""

# Port
if [ -n "${SERVER_PORT}" ]; then
    SERVER_ARGS="${SERVER_ARGS} -port=${SERVER_PORT}"
fi

# Query Port
if [ -n "${QUERY_PORT}" ]; then
    SERVER_ARGS="${SERVER_ARGS} -queryport=${QUERY_PORT}"
fi

# RCON
if [ "${RCON_ENABLED}" = "true" ] && [ -n "${RCON_PORT}" ]; then
    SERVER_ARGS="${SERVER_ARGS} -rconport=${RCON_PORT}"
fi

# Multithreading (Empfohlen für bessere Performance)
SERVER_ARGS="${SERVER_ARGS} -useperfthreads"
SERVER_ARGS="${SERVER_ARGS} -NoAsyncLoadingThread"
SERVER_ARGS="${SERVER_ARGS} -UseMultithreadForDS"

# Community-Server (für Serverliste)
if [ "${COMMUNITY_SERVER:-true}" = "true" ]; then
    SERVER_ARGS="${SERVER_ARGS} -EpicApp=PalServer"
fi

# Log-Optionen
SERVER_ARGS="${SERVER_ARGS} -logformat=text"
SERVER_ARGS="${SERVER_ARGS} -stdout"

log_info "Server-Argumente: ${SERVER_ARGS}"

# ============================================================================
# Proton-Run vorbereiten
# ============================================================================

# Proton Python-Skript für Ausführung
PROTON_PY="${PROTON_PATH}/proton"

if [ ! -f "${PROTON_PY}" ]; then
    log_warn "proton Skript nicht gefunden, versuche proton unter Wurzel..."
    PROTON_PY="${PROTON_PATH}/proton"
    
    # Versuche file direkt zu finden
    if [ ! -f "${PROTON_PY}" ]; then
        # Proton 9+ Struktur
        if [ -f "${PROTON_PATH}/files/bin/wine64" ]; then
            log_info "Verwende Wine64 direkt aus Proton-Struktur..."
            USE_WINE_DIRECT=1
        fi
    fi
fi

# ============================================================================
# Server starten
# ============================================================================

log_info "Starte PalServer via Proton..."
log_info "Dies kann einige Minuten dauern beim ersten Start..."
log_info "=========================================="

# Wechsle zu palworld Benutzer und starte Server
cd "${SERVER_DIR}"

if [ "${USE_WINE_DIRECT:-0}" = "1" ]; then
    # Direkter Wine-Modus (Fallback)
    log_warn "Verwende direkten Wine-Modus..."
    
    export WINEPREFIX="${STEAM_COMPAT_DATA_PATH}/pfx"
    mkdir -p "${WINEPREFIX}"
    
    WINE_BIN="${PROTON_PATH}/files/bin/wine64"
    
    exec su - ${USER} -c "cd ${SERVER_DIR} && \
        WINEPREFIX=${WINEPREFIX} \
        WINEDEBUG=${WINEDEBUG} \
        DISPLAY=${DISPLAY} \
        ${WINE_BIN} ${PALSERVER_EXE} ${SERVER_ARGS} 2>&1" | tee -a "${SERVER_DIR}/Pal/Saved/Logs/server_console.log"
else
    # Normaler Proton-Modus
    exec su - ${USER} -c "cd ${SERVER_DIR} && \
        STEAM_COMPAT_DATA_PATH=${STEAM_COMPAT_DATA_PATH} \
        STEAM_COMPAT_CLIENT_INSTALL_PATH=${STEAM_COMPAT_CLIENT_INSTALL_PATH} \
        WINEDEBUG=${WINEDEBUG} \
        WINEESYNC=${WINEESYNC} \
        WINEFSYNC=${WINEFSYNC} \
        PROTON_LOG=${PROTON_LOG} \
        DISPLAY=${DISPLAY} \
        ${PROTON_PY} run ${PALSERVER_EXE} ${SERVER_ARGS} 2>&1" | tee -a "${SERVER_DIR}/Pal/Saved/Logs/server_console.log"
fi
