#!/bin/bash

echo "=== MTA SERVER WRAPPER (LINUX LOG-PARSER MODE) ==="
MASTER_URL="https://master.retro-core.de"

# Standardwerte als Fallback
SERVER_PORT="2003"
SERVER_NAME="MTA 0.5 Server"
MAP_NAME="Liberty City"
MAX_PLAYERS="24"
LOGFILE="mtaserver.log"

# Prüft, ob die Datei klein- oder großgeschrieben im Ordner liegt
if [ -f "./mtaserver0.5" ]; then
    EXENAME="./mtaserver0.5"
elif [ -f "./MTAServer0.5" ]; then
    EXENAME="./MTAServer0.5"
else
    echo "FEHLER: Weder './mtaserver0.5' noch './MTAServer0.5' wurde gefunden!"
    exit 1
fi

# Konfiguration intelligent auslesen (unterstützt Groß- und Kleinschreibung)
for config in mtaserver.conf server.conf config.ini; do
    if [ -f "$config" ]; then
        while IFS= read -r line || [ -n "$line" ]; do
            clean_line=$(echo "$line" | tr -d '\r' | xargs)
            [[ "$clean_line" =~ ^# ]] && continue
            [[ -z "$clean_line" ]] && continue

            if [[ "$clean_line" =~ [=[:space:]]+ ]]; then
                key=$(echo "$clean_line" | awk -F'[=[:space:]]+' '{print $1}')
                val=$(echo "$clean_line" | cut -d'=' -s -f2- | xargs)
                if [ -z "$val" ]; then
                    val=$(echo "$clean_line" | awk '{print $2}')
                fi
                val=$(echo "$val" | tr -d '"' | tr -d "'" | xargs)

                # Alles in Kleinbuchstaben umwandeln, um Fehltreffer durch Großschreibung auszuschließen
                key_lower=$(echo "$key" | tr '[:upper:]' '[:lower:]')

                case "$key_lower" in
                    port|serverport)
                        [ -n "$val" ] && SERVER_PORT="$val"
                        ;;
                    name|servername)
                        [ -n "$val" ] && SERVER_NAME="$val"
                        ;;
                    maxplayers|max_players)
                        [ -n "$val" ] && MAX_PLAYERS="$val"
                        ;;
                    gamemap|map)
                        case "$val" in
                            1) MAP_NAME="Vice City Deathmatch" ;;
                            2) MAP_NAME="Vice City Stunt" ;;
                            3) MAP_NAME="Grand Theft Auto 3 : Portland" ;;
                            4) MAP_NAME="Grand Theft Auto 3 : Shore Side Vale" ;;
                            5) MAP_NAME="Grand Theft Auto 3 : Staunton Island" ;;
                            *) [ -n "$val" ] && MAP_NAME="$val" ;;
                        esac
                        ;;
                esac
            fi
        done < "$config"
    fi
done

# Macht die ausführbare Datei startbereit
chmod +x "$EXENAME"

echo "Starte $EXENAME (Port: $SERVER_PORT, Name: $SERVER_NAME, Map: $MAP_NAME, MaxPlayers: $MAX_PLAYERS)..."

# Einmaliger Start-Ping
echo "[Master] Sende initialen Start-Ping..."
curl -s -k -X POST "$MASTER_URL" \
    -d "status=online" \
    -d "port=$SERVER_PORT" \
    -d "name=$SERVER_NAME" \
    -d "map=$MAP_NAME" \
    -d "players=0" \
    -d "maxplayers=$MAX_PLAYERS" \
    -d "playerlist=" > /dev/null

# Die Heartbeat-Schleife läuft im Hintergrund mit
(
while true; do
    sleep 8

    CURRENT_PLAYERS=0
    PLAYER_LIST=""

    if [ -f "$LOGFILE" ]; then
        PLAYER_LIST=$(awk "
            /JOIN:[ \t]*'/ {
                split(\$0, a, \"'\");
                name = a[2];
                if (name != \"\") { players[name] = 1; }
            }
            /(QUIT|PART|KICK|BAN):[ \t]*'/ {
                split(\$0, a, \"'\");
                name = a[2];
                if (name != \"\") { delete players[name]; }
            }
            END {
                out = \"\";
                for (p in players) {
                    out = (out == \"\" ? p : out \",\" p);
                }
                print out;
            }
        " "$LOGFILE")

        if [ -z "$PLAYER_LIST" ]; then
            CURRENT_PLAYERS=0
        else
            CURRENT_PLAYERS=$(echo "$PLAYER_LIST" | awk -F, '{print NF}')
        fi
    fi

    # Heartbeat via curl an den Masterserver
    curl -s -k -X POST "$MASTER_URL" \
        -d "status=heartbeat" \
        -d "port=$SERVER_PORT" \
        -d "name=$SERVER_NAME" \
        -d "map=$MAP_NAME" \
        -d "players=$CURRENT_PLAYERS" \
        -d "maxplayers=$MAX_PLAYERS" \
        -d "playerlist=$PLAYER_LIST" > /dev/null
done
) &
LOOP_PID=$!

# Der Server läuft im Vordergrund für die Live-Konsole
"$EXENAME" 2>&1 | tee -a "$LOGFILE"

# Sobald der Server stoppt, senden wir den Offline-Ping
kill $LOOP_PID 2>/dev/null
echo "[Master] Server wurde gestoppt. Sende Offline-Ping..."
curl -s -k -X POST "$MASTER_URL" \
    -d "status=offline" \
    -d "port=$SERVER_PORT" > /dev/null

echo "Wrapper sauber beendet."