<?php
/**
 * Front Controller – Routing und Twig-Rendering
 *
 * Zentraler Einstiegspunkt für alle Seiten. Routet Anfragen
 * anhand der URI auf das passende Twig-Template und rendert
 * mit dynamischen Variablen (Cache-Hashes, OG:image, EDA-Timestamp).
 *
 * Autor: Claude Code / Mountainroad Online GmbH
 * Erstellt: 2026-03-01
 */

declare(strict_types=1);

/* Composer-Autoloader */
require_once dirname(__DIR__) . '/vendor/autoload.php';

/* Twig-Setup */
require_once dirname(__DIR__) . '/src/TwigSetup.php';

/* Admin-Auth (Session-Helper) */
require_once dirname(__DIR__) . '/src/Auth.php';

$twig = createTwigEnvironment();

/* ==========================================================================
   Site-Konfiguration
   ========================================================================== */

/** Basis-URL der Website (ohne Trailing Slash) */
const SITE_URL = 'https://codeandcrest.cc';

/* ==========================================================================
   Routing
   ========================================================================== */

/* URI normalisieren: Query-String entfernen, Trailing Slash entfernen */
$requestUri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$requestUri = rtrim($requestUri, '/') ?: '/';

/* ==========================================================================
   Admin-Routen (Login + Hintergrundbild-Verwaltung)
   Werden vor dem normalen Routing abgefangen.
   ========================================================================== */

if ($requestUri === '/login') {
    /* Wenn bereits angemeldet → direkt zur Admin-Seite */
    if (adminIsAuthenticated()) {
        header('Location: /admin/hintergrund', true, 302);
        exit;
    }

    echo $twig->render('admin/login.html.twig', [
        'site_url'         => 'https://sebastian-baus.de',
        'current_year'     => date('Y'),
        'eda_timestamp'    => time(),
        'title'            => 'Login – Code &amp; Crest',
        'meta_description' => '',
        'meta_robots'      => 'noindex, nofollow',
        'canonical'        => 'https://sebastian-baus.de/login',
        'og_title'         => 'Login',
        'og_description'   => '',
        'og_image_url'     => null,
        'twitter_card'     => 'summary',
        'twitter_description' => '',
        'extra_css'        => ['/assets/css/admin.css'],
        'body_js'          => ['/assets/js/admin-login.js'],
        'csrf_token'       => adminCsrfToken(),
        'is_admin'         => true,
    ]);
    exit;
}

if ($requestUri === '/logout') {
    adminLogout();
    header('Location: /login', true, 302);
    exit;
}

if ($requestUri === '/admin/hintergrund') {
    if (!adminIsAuthenticated()) {
        header('Location: /login', true, 302);
        exit;
    }

    echo $twig->render('admin/backgrounds.html.twig', [
        'site_url'         => 'https://sebastian-baus.de',
        'current_year'     => date('Y'),
        'eda_timestamp'    => time(),
        'title'            => 'Hintergrundbilder – Code &amp; Crest',
        'meta_description' => '',
        'meta_robots'      => 'noindex, nofollow',
        'canonical'        => 'https://sebastian-baus.de/admin/hintergrund',
        'og_title'         => 'Admin',
        'og_description'   => '',
        'og_image_url'     => null,
        'twitter_card'     => 'summary',
        'twitter_description' => '',
        'extra_css'        => ['/assets/css/admin.css'],
        'body_js'          => ['/assets/js/admin-backgrounds.js'],
        'csrf_token'       => adminCsrfToken(),
        'admin_email'      => adminCurrentUserEmail(),
        'is_admin'         => true,
    ]);
    exit;
}

/**
 * Seiten-Konfiguration: URI → Template + Metadaten
 *
 * Jeder Eintrag definiert:
 * - template:         Twig-Template-Datei
 * - title:            <title>-Tag
 * - meta_description: Meta Description
 * - canonical:        Kanonischer Pfad (relativ)
 * - meta_robots:      Robots-Anweisung (Standard: index, follow)
 * - og_title:         OG-Titel (optional, Standard = title)
 * - og_description:   OG-Beschreibung (optional)
 * - extra_css:        Zusätzliche CSS-Dateien
 * - extra_js:         Zusätzliche JS-Dateien
 * - body_js:          JS-Dateien vor </body>
 */
$routes = [
    '/' => [
        'template'         => 'index.html.twig',
        'title'            => 'Sebastian Baus – Code &amp; Crest',
        'meta_description' => 'Sebastian Baus: Chief AI Engineer, IT-Sicherheitsexperte, Netzaktivist seit 1993, Trailrunner und Gravel-Biker. Code &amp; Crest – wo Technik auf Ausdauer trifft.',
        'canonical'        => '/',
        'og_title'         => 'Sebastian Baus – Code &amp; Crest',
        'og_description'   => 'Chief AI Engineer, IT-Sicherheitsexperte, Trailrunner und Gravel-Biker. Technik nutzen, um Komplexität in Freiheit zu transformieren.',
        'twitter_card'     => 'summary_large_image',
        'twitter_description' => 'Chief AI Engineer, Trailrunner und Gravel-Biker. Code &amp; Crest – wo Technik auf Ausdauer trifft.',
        'extra_css'        => ['/assets/vendor/glightbox/glightbox.min.css'],
        'body_js'          => [
            '/assets/vendor/glightbox/glightbox.min.js',
            '/assets/js/app.js',
        ],
    ],
    '/galerie' => [
        'template'         => 'galerie.html.twig',
        'title'            => 'Galerie – Sebastian Baus | Code &amp; Crest',
        'meta_description' => 'Bildergalerie von Sebastian Baus: Impressionen von Trailrunning, Gravelbike und Natur. Automatisch aktualisiert mit aktuellen Trainingsaktivitäten.',
        'canonical'        => '/galerie',
        'og_title'         => 'Galerie – Sebastian Baus | Code &amp; Crest',
        'og_description'   => 'Bildergalerie von Sebastian Baus: Trailrunning, Gravelbike und Natur. Automatisch aktualisiert mit aktuellen Aktivitäten.',
        'twitter_card'     => 'summary',
        'twitter_description' => 'Trailrunning, Gravelbike und Natur – Bildergalerie von Sebastian Baus.',
        'extra_css'        => ['/assets/vendor/glightbox/glightbox.min.css'],
        'body_js'          => [
            '/assets/vendor/glightbox/glightbox.min.js',
            '/assets/js/gallery-page.js',
        ],
    ],
    '/highlights' => [
        'template'         => 'highlights.html.twig',
        'title'            => 'Highlights – Sebastian Baus | Code &amp; Crest',
        'meta_description' => 'Ausgewählte Highlight-Bilder von Sebastian Baus: Die besten Momente von Trailrunning, Gravelbike und Natur.',
        'canonical'        => '/highlights',
        'og_title'         => 'Highlights – Sebastian Baus | Code &amp; Crest',
        'og_description'   => 'Die besten Momente von Trail, Gravel und Natur – ausgewählte Highlight-Bilder von Sebastian Baus.',
        'twitter_card'     => 'summary',
        'twitter_description' => 'Die besten Momente von Trail, Gravel und Natur – Highlights von Sebastian Baus.',
        'extra_css'        => ['/assets/vendor/glightbox/glightbox.min.css'],
        'body_js'          => [
            '/assets/vendor/glightbox/glightbox.min.js',
            '/assets/js/highlights-page.js',
        ],
    ],
    '/impressum' => [
        'template'         => 'impressum.html.twig',
        'title'            => 'Impressum – Sebastian Baus | Code &amp; Crest',
        'meta_description' => 'Impressum von Sebastian Baus – Code &amp; Crest. Angaben gemäß § 5 DDG.',
        'canonical'        => '/impressum',
        'meta_robots'      => 'noindex, follow',
        'og_title'         => 'Impressum – Sebastian Baus | Code &amp; Crest',
        'extra_css'        => [],
        'body_js'          => [],
    ],
    '/datenschutz' => [
        'template'         => 'datenschutz.html.twig',
        'title'            => 'Datenschutz – Sebastian Baus | Code &amp; Crest',
        'meta_description' => 'Datenschutzerklärung von Sebastian Baus – Code &amp; Crest. Informationen zur Datenverarbeitung gemäß DSGVO.',
        'canonical'        => '/datenschutz',
        'meta_robots'      => 'noindex, follow',
        'og_title'         => 'Datenschutz – Sebastian Baus | Code &amp; Crest',
        'extra_css'        => [],
        'body_js'          => [],
    ],
];

/* Route suchen */
$page = $routes[$requestUri] ?? null;

if ($page === null) {
    http_response_code(404);
    echo $twig->render('404.html.twig', [
        'site_url'      => SITE_URL,
        'current_year'  => date('Y'),
        'eda_timestamp' => time(),
        'title'         => '404 – Seite nicht gefunden | Code &amp; Crest',
        'meta_robots'   => 'noindex, follow',
        'canonical'     => SITE_URL . '/',
    ]);
    exit;
}

/* ==========================================================================
   Dynamische Daten
   ========================================================================== */

/* OG:image für die Startseite aus der Datenbank laden */
$ogImageUrl = null;
if ($requestUri === '/') {
    try {
        require_once dirname(__DIR__) . '/api/config.php';
        $pdo = getDatabase();
        $stmt = $pdo->query('
            SELECT filename_og FROM images
            WHERE filename_og IS NOT NULL
            ORDER BY activity_date IS NULL ASC,
                     COALESCE(activity_date, created_at) DESC
            LIMIT 1
        ');
        $row = $stmt->fetch();
        if ($row && !empty($row['filename_og'])) {
            $ogImageUrl = SITE_URL . '/uploads/gallery/' . $row['filename_og'];
        }
    } catch (Exception $e) {
        /* DB nicht verfügbar – OG:image bleibt leer */
        error_log('Front Controller: OG-Bild konnte nicht geladen werden: ' . $e->getMessage());
    }
}

/* ==========================================================================
   Template rendern
   ========================================================================== */

/* Globale + seitenspezifische Variablen zusammenführen */
$templateVars = [
    /* Globale Variablen */
    'site_url'      => SITE_URL,
    'current_year'  => date('Y'),
    'eda_timestamp' => time(),

    /* Admin-Login-Status für Footer-Links */
    'is_authenticated' => adminIsAuthenticated(),
    'admin_email'      => adminCurrentUserEmail(),

    /* Seitenspezifische Variablen */
    'title'               => $page['title'],
    'meta_description'    => $page['meta_description'],
    'meta_robots'         => $page['meta_robots'] ?? 'index, follow',
    'canonical'           => SITE_URL . $page['canonical'],
    'og_title'            => $page['og_title'] ?? $page['title'],
    'og_description'      => $page['og_description'] ?? '',
    'og_image_url'        => $ogImageUrl,
    'twitter_card'        => $page['twitter_card'] ?? 'summary',
    'twitter_description' => $page['twitter_description'] ?? '',
    'extra_css'           => $page['extra_css'] ?? [],
    'body_js'             => $page['body_js'] ?? [],
];

echo $twig->render($page['template'], $templateVars);
