#!/bin/bash

# Prüfe Abhängigkeiten, bevor irgendetwas anderes passiert
./check_dependencies.sh || exit 1

# Lade globale Konfiguration
# Annahme: config.sh liegt im selben Verzeichnis wie dieses Skript
CONFIG_FILE_PATH="$(dirname "$0")/config.sh"
if [ -f "$CONFIG_FILE_PATH" ]; then
    source "$CONFIG_FILE_PATH"
else
    # Minimales Logging, falls Haupt-Log-Funktion nicht verfügbar oder config nicht geladen werden kann
    echo "$(date '+%Y-%m-%d %H:%M:%S') - FEHLER: Globale config.sh nicht unter ${CONFIG_FILE_PATH} gefunden! Status-Skript kann nicht laufen." >> "/tmp/check_server_status_bootstrap_error.log"
    exit 1
fi

# === Abgeleitete Variablen für dieses Skript ===
SCRIPT_BASENAME=$(basename "$0" .sh)
LOG_FILE="${LOG_DIR_BASE}/${SCRIPT_BASENAME}.log" # Eigene Log-Datei (z.B. /var/log/luweb/check_server_status.log)
LOCK_FILE="${LOCK_FILE_BASE_DIR}/${SCRIPT_BASENAME}.lock" # Eigene Lock-Datei

# === Logging Funktion ===
log_message() {
    local message_to_log
    message_to_log="$(date '+%Y-%m-%d %H:%M:%S') - $1" # Weltname nicht im Prefix, da es alle Welten prüft
    if [ -t 1 ]; then # Prüft, ob stdout ein Terminal ist
        echo "${message_to_log}" | tee -a "$LOG_FILE"
    else
        echo "${message_to_log}" >> "$LOG_FILE"
    fi
}

# === Hauptlogik ===
exec 200>"$LOCK_FILE"
flock -n 200 || { log_message "Script ${SCRIPT_BASENAME}.sh ist bereits aktiv (Lock: ${LOCK_FILE}). Beende."; exit 1; }
trap 'rm -f "$LOCK_FILE"; log_message "Script ${SCRIPT_BASENAME}.sh beendet."' EXIT

mkdir -p "$LOG_DIR_BASE" # Sicherstellen, dass Log-Verzeichnis existiert
log_message "Script ${SCRIPT_BASENAME}.sh gestartet."

if ! command -v ss &> /dev/null; then
    log_message "FEHLER: 'ss' (Socket Statistics) nicht gefunden. Port-Status kann nicht geprüft werden."
    exit 1
fi

# === NEU: Welt-Entdeckung aus dem Minetest-Datenverzeichnis ===
log_message "Suche nach Welten in ${MINETESTMAPPER_WORLD_DATA_BASE_PATH}..."
shopt -s nullglob
world_key_dirs=("${MINETESTMAPPER_WORLD_DATA_BASE_PATH}"/*/) # Scannt Unterverzeichnisse
shopt -u nullglob

if [ ${#world_key_dirs[@]} -eq 0 ]; then
    log_message "Keine Welt-Verzeichnisse in ${MINETESTMAPPER_WORLD_DATA_BASE_PATH} gefunden. Beende."
    exit 0
fi

for world_data_dir in "${world_key_dirs[@]}"; do
    current_world_key=$(basename "$world_data_dir")
    world_mt_file="${world_data_dir}world.mt"
    web_conf_file="${world_data_dir}web.conf"

    # Eine Welt wird nur geprüft, wenn sie eine world.mt und eine web.conf hat
    if [ ! -f "$world_mt_file" ] || [ ! -f "$web_conf_file" ]; then
        log_message "WARNUNG: Für Welt-Schlüssel '${current_world_key}' fehlt world.mt oder web.conf. Überspringe Status-Check."
        continue
    fi

    # Lade Standardwerte und überschreibe mit welt-spezifischer web.conf
    # Für dieses Skript sind nur SERVER_ADDRESS und SERVER_PORT relevant
    SERVER_ADDRESS="$DEFAULT_SERVER_ADDRESS" 
    SERVER_PORT="$DEFAULT_SERVER_PORT"       
    source "$web_conf_file" # Lädt u.a. SERVER_ADDRESS und SERVER_PORT

    if [ -z "$SERVER_PORT" ] || [ -z "$SERVER_ADDRESS" ]; then
        log_message "WARNUNG: Port ('${SERVER_PORT}') oder Adresse ('${SERVER_ADDRESS}') für Welt '${current_world_key}' nicht konfiguriert. Überspringe."
        continue
    fi

    # Pfad zur online_status.txt Datei im Webverzeichnis der Welt
    status_file_dir="${WEB_ROOT_PATH}/${WEB_MAPS_BASE_SUBDIR}/${current_world_key}"
    status_file_path="${status_file_dir}/online_status.txt"
    
    mkdir -p "$status_file_dir" # Stelle sicher, dass das Verzeichnis existiert
    if [ ! -d "$status_file_dir" ]; then
        log_message "FEHLER: Konnte Verzeichnis ${status_file_dir} nicht erstellen. Überspringe Welt ${current_world_key}."
        continue
    fi
    
    log_message "Prüfe lokalen Port für Welt '${current_world_key}': ${SERVER_PORT}"
    
    current_status="offline" # Standardmäßig offline setzen
    
    # Prüfe mit 'ss -tulpn', ob der Port in der Ausgabe der lauschenden Sockets vorkommt.
    # Dies prüft, ob ein Dienst (TCP oder UDP) auf dem Port auf dem lokalen System lauscht.
    if ss -tulpn | grep -qE ":${SERVER_PORT}([[:space:]]|$)"; then
        current_status="online"
    fi
    
    last_update_time=$(date '+%Y-%m-%d %H:%M:%S %Z')
    echo "${current_status} - ${last_update_time}" > "$status_file_path"
    log_message "Status für ${current_world_key} (Port ${SERVER_PORT}): ${current_status}. Datei aktualisiert: ${status_file_path}"

done

log_message "Alle konfigurierten Welten geprüft."
exit 0
