<?php
declare(strict_types=1);

require_once __DIR__ . '/common.php';

if (installIsCli()) {
    try {
        $config = installLoadConfig();
        $pdo = installConnectPdo($config['db']);
        installRequireCoreTables($pdo, ['lists', 'forms', 'settings', 'smtp_accounts', 'sender_identities']);
        installRunPendingMigrations($pdo);
        installWriteLock(['mode' => 'cli-update']);
        installPrint('Update abgeschlossen.');
        installStatus($pdo);
        exit(0);
    } catch (Throwable $e) {
        installWriteError('[error] ' . $e->getMessage());
        exit(1);
    }
}

installStartSession();
$messages = [];
$logOutput = '';

try {
    if (!installIsAdminSession()) {
        throw new RuntimeException('Web-Updates sind nur für eingeloggte Admin-Benutzer erlaubt. Bitte zuerst im Admin-Bereich anmelden.');
    }

    $config = installLoadConfig();
    $pdo = installConnectPdo($config['db']);
    installRequireCoreTables($pdo, ['lists', 'forms', 'settings', 'smtp_accounts', 'sender_identities']);

    $pendingMigrations = installPendingMigrationKeys($pdo);

    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        $csrf = (string) ($_POST['csrf_token'] ?? '');
        if (!installVerifyCsrf($csrf, 'update_csrf')) {
            throw new RuntimeException('Ungültiges Formular-Token. Bitte Seite neu laden.');
        }

        $logOutput = installCaptureOutput(static function () use ($pdo): void {
            installRunPendingMigrations($pdo);
            installStatus($pdo);
        });
        installWriteLock([
            'mode' => 'web-update',
            'admin_email' => (string) ($_SESSION['admin_email'] ?? ''),
        ]);
        $messages[] = ['type' => 'ok', 'text' => 'Update erfolgreich abgeschlossen.'];
        $pendingMigrations = installPendingMigrationKeys($pdo);
    }
} catch (Throwable $e) {
    $messages[] = ['type' => 'err', 'text' => $e->getMessage()];
}

$csrfToken = installCsrfToken('update_csrf');
$boxes = '';
foreach ($messages as $message) {
    $boxes .= '<div class="box ' . installH($message['type']) . '"><strong>' . installH($message['text']) . '</strong></div>';
}

$pendingHtml = '';
if (isset($pendingMigrations)) {
    if ($pendingMigrations === []) {
        $pendingHtml = '<div class="box ok"><strong>Keine offenen Migrationen.</strong><br>Die Datenbank ist bereits aktuell.</div>';
    } else {
        $pendingHtml = '<div class="box warn"><strong>Offene Migrationen</strong><ul>';
        foreach ($pendingMigrations as $migrationKey) {
            $pendingHtml .= '<li><code>' . installH($migrationKey) . '</code></li>';
        }
        $pendingHtml .= '</ul></div>';
    }
}

$formHtml = '';
if (installIsAdminSession() && isset($pendingMigrations) && $pendingMigrations !== []) {
    $formHtml = '<form method="post" action="update.php" class="box">'
        . '<input type="hidden" name="csrf_token" value="' . installH($csrfToken) . '">'
        . '<p>Das Update führt nur die noch fehlenden Migrationen aus.</p>'
        . '<div class="actions"><button type="submit">Update jetzt ausführen</button><a class="btn btn-secondary" href="index.php">Zurück</a></div>'
        . '</form>';
}

$logHtml = $logOutput !== '' ? '<h2>Ausgabe</h2><pre>' . installH(trim($logOutput)) . '</pre>' : '';
$sessionHtml = '<div class="box"><strong>Angemeldet als:</strong> ' . installH((string) ($_SESSION['admin_email'] ?? 'nicht angemeldet')) . '</div>';

installRenderPage(
    'MailResponder Update',
    '<h1>MailResponder Update</h1>'
    . '<p class="muted">Web-Update für bestehende Installationen. Zugriff nur mit aktiver Admin-Session.</p>'
    . $boxes
    . $sessionHtml
    . $pendingHtml
    . $formHtml
    . $logHtml
    . '<div class="actions"><a class="btn btn-secondary" href="index.php">Install-Startseite</a><a class="btn btn-secondary" href="check.php">Check</a></div>'
);