<?php
declare(strict_types=1);

require_once __DIR__ . '/common.php';

if (installIsCli()) {
    $argv = installArgv();

    try {
        $config = installLoadConfig();
        $pdo = installConnectPdo($config['db']);
        $options = installParseCliOptions($argv);

        $coreTables = installCoreTables();
        $schemaPath = installResolveSchemaPath($argv, 'install/sql/mr.sql');

        installPrint('Importiere Basisschema: ' . $schemaPath);
        installRunSqlFile($pdo, $schemaPath);
        installRequireCoreTables($pdo, $coreTables);
        installRunPendingMigrations($pdo);

        if (!empty($options['admin-email']) && !empty($options['admin-password'])) {
            $adminName = (string) ($options['admin-name'] ?? 'Administrator');
            $adminRole = (string) ($options['admin-role'] ?? 'admin');
            installCreateOrUpdateAdmin(
                $pdo,
                (string) $options['admin-email'],
                (string) $options['admin-password'],
                $adminName,
                $adminRole
            );
        } else {
            installPrint('Hinweis: Kein Admin angelegt. Verwende --admin-email und --admin-password für den ersten Benutzer.');
        }

        installWriteLock(['mode' => 'cli-install']);
        installPrint('Installation/Migration abgeschlossen.');
        installStatus($pdo);
        exit(0);
    } catch (Throwable $e) {
        installWriteError('[error] ' . $e->getMessage());
        exit(1);
    }
}

installStartSession();

$messages = [];
$logOutput = '';
$form = [
    'admin_email' => '',
    'admin_name' => 'Administrator',
    'admin_role' => 'admin',
];

try {
    $summary = installStatusSummary();

    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        $form['admin_email'] = trim((string) ($_POST['admin_email'] ?? ''));
        $form['admin_name'] = trim((string) ($_POST['admin_name'] ?? 'Administrator'));
        $form['admin_role'] = trim((string) ($_POST['admin_role'] ?? 'admin')) ?: 'admin';
        $adminPassword = (string) ($_POST['admin_password'] ?? '');
        $csrf = (string) ($_POST['csrf_token'] ?? '');

        if (!installVerifyCsrf($csrf)) {
            throw new RuntimeException('Ungültiges Formular-Token. Bitte Seite neu laden.');
        }

        if (installIsLocked()) {
            throw new RuntimeException('Die Installation ist bereits gesperrt. Lösche install/install.lock nur bewusst für eine Neuinstallation.');
        }

        if (!$summary['config_exists']) {
            throw new RuntimeException('includes/config.php fehlt.');
        }

        if (!$summary['schema_exists']) {
            throw new RuntimeException('Basisschema install/sql/mr.sql fehlt.');
        }

        if ($form['admin_email'] === '' || !filter_var($form['admin_email'], FILTER_VALIDATE_EMAIL)) {
            throw new RuntimeException('Bitte eine gültige Admin-E-Mail angeben.');
        }

        if ($adminPassword === '') {
            throw new RuntimeException('Bitte ein Passwort für den ersten Admin angeben.');
        }

        $config = installLoadConfig();
        $pdo = installConnectPdo($config['db']);

        if (installHasAnyCoreTable($pdo)) {
            throw new RuntimeException('Die Datenbank enthält bereits MR-Tabellen. Für bestehende Installationen bitte update.php verwenden.');
        }

        $logOutput = installCaptureOutput(static function () use ($pdo, $form, $adminPassword): void {
            $schemaPath = installSchemaDefaultPath();
            installPrint('Importiere Basisschema: ' . $schemaPath);
            installRunSqlFile($pdo, $schemaPath);
            installRequireCoreTables($pdo, installCoreTables());
            installRunPendingMigrations($pdo);
            installCreateOrUpdateAdmin($pdo, $form['admin_email'], $adminPassword, $form['admin_name'], $form['admin_role']);
            installStatus($pdo);
        });

        installWriteLock([
            'mode' => 'web-install',
            'admin_email' => $form['admin_email'],
        ]);

        $messages[] = ['type' => 'ok', 'text' => 'Installation erfolgreich abgeschlossen. Die Installation ist jetzt über install.lock gesperrt.'];
        $summary = installStatusSummary();
    }
} catch (Throwable $e) {
    $messages[] = ['type' => 'err', 'text' => $e->getMessage()];
    $summary = $summary ?? installStatusSummary();
}

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

$statusRows = [
    ['Konfiguration', $summary['config_exists'] ? 'OK' : 'Fehlt'],
    ['Basisschema', $summary['schema_exists'] ? 'OK' : 'Fehlt'],
    ['DB-Verbindung', $summary['db_ok'] ? 'OK' : 'Fehler'],
    ['Vorhandene Installation', $summary['installed'] ? 'Ja' : 'Nein'],
    ['Install-Lock', $summary['locked'] ? 'Aktiv' : 'Nicht gesetzt'],
    ['Offene Migrationen', (string) count($summary['pending_migrations'])],
];

$tableHtml = '<table><tbody>';
foreach ($statusRows as [$label, $value]) {
    $tableHtml .= '<tr><th>' . installH($label) . '</th><td>' . installH($value) . '</td></tr>';
}
$tableHtml .= '</tbody></table>';

$lockHtml = '';
if ($lockInfo !== []) {
    $lockHtml = '<div class="box warn"><strong>Lock-Info</strong><pre>' . installH(json_encode($lockInfo, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)) . '</pre></div>';
}

$formHtml = '';
if (!$summary['locked']) {
    $formHtml = '
    <form method="post" action="install.php" class="box">
      <input type="hidden" name="csrf_token" value="' . installH($csrfToken) . '">
      <label for="admin_email">Admin-E-Mail</label>
      <input id="admin_email" name="admin_email" type="email" required value="' . installH($form['admin_email']) . '">
      <label for="admin_password">Admin-Passwort</label>
      <input id="admin_password" name="admin_password" type="password" required>
      <label for="admin_name">Admin-Name</label>
      <input id="admin_name" name="admin_name" type="text" value="' . installH($form['admin_name']) . '">
      <label for="admin_role">Admin-Rolle</label>
      <input id="admin_role" name="admin_role" type="text" value="' . installH($form['admin_role']) . '">
      <div class="actions">
        <button type="submit">Installation starten</button>
        <a class="btn btn-secondary" href="index.php">Zurück</a>
      </div>
    </form>';
} else {
    $formHtml = '<div class="box warn"><strong>Neuinstallation gesperrt.</strong><br>Die Datei <code>install/install.lock</code> ist vorhanden. Für eine Neuinstallation musst du den Lock bewusst entfernen.</div>';
}

$logHtml = $logOutput !== '' ? '<h2>Ausgabe</h2><pre>' . installH(trim($logOutput)) . '</pre>' : '';
$errorHtml = $summary['error'] !== '' ? '<div class="box err"><strong>Systemhinweis:</strong><br>' . installH($summary['error']) . '</div>' : '';

installRenderPage(
    'MailResponder Installation',
    '<h1>MailResponder Installation</h1>'
    . '<p class="muted">Web-Installer für einfache Hostings. Nach erfolgreicher Installation wird automatisch ein Lock gesetzt.</p>'
    . $boxes
    . $errorHtml
    . '<h2>Status</h2>'
    . $tableHtml
    . $lockHtml
    . '<h2>Neuinstallation</h2>'
    . '<p>Voraussetzung: <code>includes/config.php</code> ist korrekt gesetzt und die Datenbank ist noch leer.</p>'
    . $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>'
);