#!/bin/bash
# ============================================================================
# Palworld Mod Installer
# Installiert UE4SS (Unreal Engine 4 Scripting System) für Mod-Unterstützung
# ============================================================================

set -e

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

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

# ============================================================================
# Konfiguration
# ============================================================================

UE4SS_RELEASE_URL="https://github.com/UE4SS-RE/RE-UE4SS/releases"
UE4SS_TAG="experimental-latest"
MODS_TEMP_DIR="/tmp/palworld-mods"
UE4SS_INSTALL_DIR="${SERVER_DIR}/Pal/Binaries/Win64"

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

get_ue4ss_download_url() {
    # Hole die neueste experimental release URL
    log_info "Suche nach UE4SS ${UE4SS_TAG}..."
    
    # GitHub API nutzen um den neuesten Release zu finden
    local api_url="https://api.github.com/repos/UE4SS-RE/RE-UE4SS/releases/tags/${UE4SS_TAG}"
    
    # Versuche zuerst den spezifischen Tag
    local download_url=$(curl -sL "${api_url}" | jq -r '.assets[] | select(.name | contains("UE4SS") and contains(".zip")) | .browser_download_url' | head -1)
    
    if [ -z "$download_url" ] || [ "$download_url" = "null" ]; then
        log_warn "Tag ${UE4SS_TAG} nicht gefunden, suche nach neuestem Experimental..."
        
        # Fallback: Liste alle Releases und finde experimental
        api_url="https://api.github.com/repos/UE4SS-RE/RE-UE4SS/releases"
        download_url=$(curl -sL "${api_url}" | jq -r '[.[] | select(.tag_name | contains("experimental"))][0] | .assets[] | select(.name | contains("UE4SS") and contains(".zip")) | .browser_download_url' | head -1)
    fi
    
    if [ -z "$download_url" ] || [ "$download_url" = "null" ]; then
        log_error "Konnte UE4SS Download-URL nicht ermitteln!"
        return 1
    fi
    
    echo "$download_url"
}

install_ue4ss() {
    log_info "=========================================="
    log_info "UE4SS Installation"
    log_info "=========================================="
    
    # Prüfe ob UE4SS bereits installiert ist
    if [ -f "${UE4SS_INSTALL_DIR}/UE4SS.dll" ] && [ "${FORCE_REINSTALL_UE4SS:-false}" != "true" ]; then
        log_info "UE4SS ist bereits installiert. Überspringe..."
        log_info "(Um Neuinstallation zu erzwingen: FORCE_REINSTALL_UE4SS=true)"
        return 0
    fi
    
    # Erstelle Temp-Verzeichnis
    mkdir -p "${MODS_TEMP_DIR}"
    cd "${MODS_TEMP_DIR}"
    
    # Download URL ermitteln
    local download_url=$(get_ue4ss_download_url)
    if [ $? -ne 0 ]; then
        return 1
    fi
    
    log_info "Download von: ${download_url}"
    
    # Download
    local filename=$(basename "$download_url")
    log_info "Lade ${filename} herunter..."
    
    if ! curl -fsSL -o "${filename}" "${download_url}"; then
        log_error "Download fehlgeschlagen!"
        return 1
    fi
    
    log_success "Download abgeschlossen"
    
    # Entpacke
    log_info "Entpacke ${filename}..."
    if ! unzip -q "${filename}"; then
        log_error "Entpacken fehlgeschlagen!"
        return 1
    fi
    
    # Finde das UE4SS-Verzeichnis (kann variieren je nach Release)
    local ue4ss_extracted_dir=$(find . -maxdepth 2 -type d -name "*UE4SS*" | head -1)
    if [ -z "$ue4ss_extracted_dir" ]; then
        # Fallback: Suche nach der DLL direkt
        ue4ss_extracted_dir="."
    fi
    
    log_info "Gefundenes Verzeichnis: ${ue4ss_extracted_dir}"
    
    # Stelle sicher dass Zielverzeichnis existiert
    mkdir -p "${UE4SS_INSTALL_DIR}"
    
    # Kopiere Dateien
    log_info "Installiere UE4SS nach ${UE4SS_INSTALL_DIR}..."
    
    # Wichtige Dateien kopieren
    local files_to_copy=("UE4SS.dll" "UE4SS.pdb" "dwmapi.dll" "xinput1_3.dll" "lua54.dll")
    local optional_files=("Mods" "UE4SS-settings.ini" "UE4SS-logging.ini")
    
    for file in "${files_to_copy[@]}"; do
        if [ -f "${ue4ss_extracted_dir}/${file}" ]; then
            cp "${ue4ss_extracted_dir}/${file}" "${UE4SS_INSTALL_DIR}/"
            log_info "Kopiert: ${file}"
        else
            log_warn "Nicht gefunden: ${file}"
        fi
    done
    
    # Optionale Dateien/Verzeichnisse
    for item in "${optional_files[@]}"; do
        if [ -e "${ue4ss_extracted_dir}/${item}" ]; then
            cp -r "${ue4ss_extracted_dir}/${item}" "${UE4SS_INSTALL_DIR}/"
            log_info "Kopiert: ${item}"
        fi
    done
    
    # Berechtigungen setzen
    chown -R ${USER}:${USER} "${UE4SS_INSTALL_DIR}"
    
    # Aufräumen
    cd /
    rm -rf "${MODS_TEMP_DIR}"
    
    log_success "=========================================="
    log_success "UE4SS Installation abgeschlossen!"
    log_success "=========================================="
    log_info "Installiert in: ${UE4SS_INSTALL_DIR}"
    log_info "Mods-Verzeichnis: ${MODS_DIR}"
    
    return 0
}

setup_mods_directory() {
    log_info "Richte Mods-Verzeichnis ein..."
    
    # Erstelle Mods-Verzeichnisstruktur
    mkdir -p "${MODS_DIR}/UE4SS/Mods"
    mkdir -p "${MODS_DIR}/custom"
    
    # Symlink von /opt/palworld/mods zu Server-Mods falls noch nicht vorhanden
    local server_mods_dir="${SERVER_DIR}/Pal/Content/Paks/mods"
    if [ ! -d "${server_mods_dir}" ]; then
        mkdir -p "$(dirname ${server_mods_dir})"
        ln -sf "${MODS_DIR}/custom" "${server_mods_dir}" 2>/dev/null || true
    fi
    
    # Berechtigungen
    chown -R ${USER}:${USER} "${MODS_DIR}"
    
    log_info "Mods-Verzeichnis eingerichtet: ${MODS_DIR}"
}

show_ue4ss_info() {
    log_info ""
    log_info "=========================================="
    log_info "UE4SS / Mod-Informationen"
    log_info "=========================================="
    log_info "UE4SS ermöglicht Lua-Scripting für Palworld."
    log_info ""
    log_info "Wichtige Pfade:"
    log_info "  UE4SS DLL: ${UE4SS_INSTALL_DIR}/UE4SS.dll"
    log_info "  Mods: ${MODS_DIR}"
    log_info "  Logs: ${SERVER_DIR}/Pal/Binaries/Win64/UE4SS.log"
    log_info ""
    log_info "Mod-Installation:"
    log_info "  1. Mods nach ./data/mods/custom/ kopieren"
    log_info "  2. Container neu starten"
    log_info ""
    log_info "Dokumentation: https://docs.ue4ss.com/"
    log_info "=========================================="
}

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

case "${1:-}" in
    --install-ue4ss|-i)
        install_ue4ss
        ;;
    --setup|-s)
        setup_mods_directory
        ;;
    --info)
        show_ue4ss_info
        ;;
    --help|-h|*)
        echo "Palworld Mod Installer"
        echo ""
        echo "Verwendung:"
        echo "  --install-ue4ss, -i  - UE4SS installieren/updaten"
        echo "  --setup, -s          - Mods-Verzeichnis einrichten"
        echo "  --info               - Zeigt UE4SS-Informationen"
        echo ""
        echo "Umgebungsvariablen:"
        echo "  INSTALL_UE4SS=${INSTALL_UE4SS:-false}"
        echo "  FORCE_REINSTALL_UE4SS=${FORCE_REINSTALL_UE4SS:-false}"
        echo "  MODS_DIR=${MODS_DIR}"
        echo "  SERVER_DIR=${SERVER_DIR}"
        ;;
esac
