<?php

// Strenge Typprüfung für Parameter- und Rückgabetypen aktivieren.
declare(strict_types=1);

// Eine neue Session wird gestartet und die entsprechende Variable ($_SESSION) angelegt oder eine bestehende wird fortgesetzt.
session_start();

/*
 * Registriert eine Autoload-Funktion für Klassen mit dem Namespace-Präfix "App\".
 * Statt jede Klasse manuell über "require pfad_zur_klasse.php" einzubinden,
 * versucht PHP nun automatisch, die passende Datei zu laden, sobald eine Klasse
 * im Namespace "App\..." verwendet wird.
 */
spl_autoload_register(
    // Anonyme Funktion, die den Klassennamen prüft und den Dateipfad zur Klasse ermittelt.
    static function (string $class): void {
        $prefix  = 'App\\';
        $baseDir = __DIR__ . '/../app/';

        $len = strlen($prefix);
        if (strncmp($prefix, $class, $len) !== 0) {
            return;
        }

        $relativeClass = substr($class, $len);
        $file          = $baseDir . str_replace('\\', DIRECTORY_SEPARATOR, $relativeClass) . '.php';

        if (file_exists($file) === true) {
            require $file;
        }
    }
);

// Pfad zur Konfigurationsdatei prüfen und Konfiguration laden
$configPath = __DIR__ . '/../config/config.php';
if (file_exists($configPath) === false) {
    // Fail fast: ohne Konfiguration macht die App keinen Sinn
    http_response_code(500);
    echo 'Konfigurationsdatei config/config.php wurde nicht gefunden. '
        . 'Bitte config.example.php kopieren und anpassen.';
    exit;
}

/** @var array<string, mixed> $config */
$config = require $configPath;

use App\Controllers\AuthController;

// Hilfsfunktion für geschützte Routen
function requireLogin(array $config): void
{
    // session_key_user aus dem Config-Array lesen. Wenn nicht gesetzt oder null, Standard "admin_user" verwenden.
    $sessionKey = $config['security']['session_key_user'] ?? 'admin_user';

    // Prüfen, ob in $_SESSION unter diesem Key ein eingeloggter Benutzer hinterlegt ist.
    // Falls nicht, zurück zur Login-Seite umleiten.
    if (isset($_SESSION[$sessionKey]) === false) {
        header('Location: index.php?route=login');
        exit;
    }
}

// Route aus dem GET-Parameter lesen. Wenn nicht gesetzt, Standardroute "login" verwenden.
$route = $_GET['route'] ?? 'login';

// Neue Instanz der Klasse AuthController erstellen (wird bei Bedarf über den Autoloader geladen).
$authController = new AuthController($config);

// Anhand des Routing-Ziels (route) entscheiden, welcher Code ausgeführt wird.
switch ($route) {
    case 'login':
        $authController->showLoginForm();
        break;

    case 'login.submit':
        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
            header('Location: index.php?route=login');
            exit;
        }
        $authController->processLogin();
        break;

    case 'logout':
        $authController->logout();
        break;

    case 'dashboard':
        requireLogin($config);
        // Später: DashboardController aufrufen
        echo '<h1>Dashboard (Platzhalter)</h1>';
        echo '<p>Hier kommt später dein SNMP/Server-Status hin.</p>';
        echo '<p><a href="index.php?route=logout">Logout</a></p>';
        break;

    default:
        http_response_code(404);
        echo 'Route nicht gefunden.';
        break;
}
