<?php
declare(strict_types=1);

session_start();

$rootDir = __DIR__;
$appConfigFile = $rootDir . '/includes/app_config.php';
$appConfig = is_file($appConfigFile) ? (require $appConfigFile) : [];
$installCompleteSession = $_SESSION['install_complete'] ?? null;
$showFinalStep = is_array($installCompleteSession) && !empty($_GET['done']);

if (!empty($appConfig['installed']) && !$showFinalStep) {
    exit('CMS вже встановлена. Якщо потрібна повторна установка — видаліть або змініть includes/app_config.php вручну.');
}

function h(?string $value): string {
    return htmlspecialchars((string)$value, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}

function build_base_url(): array {
    $https = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || (string)($_SERVER['SERVER_PORT'] ?? '') === '443';
    $scheme = $https ? 'https' : 'http';
    $host = (string)($_SERVER['HTTP_HOST'] ?? 'localhost');
    $domain = preg_replace('~:\d+$~', '', $host) ?: $host;
    return [$scheme . '://' . $host, $domain];
}

function post_value(string $key, string $default = ''): string {
    return trim((string)($_POST[$key] ?? $default));
}

function save_uploaded_logo(array $fileInfo, string $targetPath): array {
    if (($fileInfo['error'] ?? UPLOAD_ERR_NO_FILE) === UPLOAD_ERR_NO_FILE) {
        return [true, false, ''];
    }

    if (($fileInfo['error'] ?? UPLOAD_ERR_OK) !== UPLOAD_ERR_OK) {
        return [false, false, 'Не вдалося завантажити логотип.'];
    }

    $tmpName = (string)($fileInfo['tmp_name'] ?? '');
    if ($tmpName === '' || !is_uploaded_file($tmpName)) {
        return [false, false, 'Некоректний файл логотипа.'];
    }

    $imageInfo = @getimagesize($tmpName);
    if (!$imageInfo) {
        return [false, false, 'Логотип має бути зображенням JPG, PNG, GIF або WebP.'];
    }

    $allowedMime = ['image/jpeg' => 'jpg', 'image/png' => 'png', 'image/gif' => 'gif', 'image/webp' => 'webp'];
    $mime = (string)($imageInfo['mime'] ?? '');
    if (!isset($allowedMime[$mime])) {
        return [false, false, 'Дозволені тільки JPG, PNG, GIF або WebP.'];
    }

    $targetDir = dirname($targetPath);
    if (!is_dir($targetDir) && !mkdir($targetDir, 0775, true) && !is_dir($targetDir)) {
        return [false, false, 'Не вдалося створити папку для логотипа.'];
    }

    if (!@move_uploaded_file($tmpName, $targetPath)) {
        return [false, false, 'Не вдалося зберегти логотип на сервері.'];
    }

    @chmod($targetPath, 0644);
    return [true, true, ''];
}


function import_sql(mysqli $conn, string $sqlFile): array {
    $sql = file_get_contents($sqlFile);
    if ($sql === false) {
        return [false, 'Не вдалося прочитати schema.sql'];
    }

    if (!$conn->multi_query($sql)) {
        return [false, 'Помилка імпорту БД: ' . $conn->error];
    }

    do {
        if ($result = $conn->store_result()) {
            $result->free();
        }
    } while ($conn->more_results() && $conn->next_result());

    if ($conn->errno) {
        return [false, 'Помилка імпорту БД: ' . $conn->error];
    }

    return [true, 'OK'];
}

function write_php_array_file(string $path, array $data): bool {
    $export = "<?php\nreturn " . var_export($data, true) . ";\n";
    return file_put_contents($path, $export) !== false;
}

function send_license_request(string $apiUrl, array $payload): array {
    $ch = curl_init($apiUrl);
    if ($ch === false) {
        return ['ok' => false, 'message' => 'Не вдалося ініціалізувати CURL.'];
    }

    $body = json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST => true,
        CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'Accept: application/json'],
        CURLOPT_POSTFIELDS => $body,
        CURLOPT_CONNECTTIMEOUT => 15,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_SSL_VERIFYPEER => true,
        CURLOPT_SSL_VERIFYHOST => 2,
    ]);

    $response = curl_exec($ch);
    $error = curl_error($ch);
    $httpCode = (int)curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
    curl_close($ch);

    if ($response === false || $response === '') {
        return ['ok' => false, 'message' => 'Сервер ліцензій не відповів: ' . $error];
    }

    $decoded = json_decode($response, true);
    if (!is_array($decoded)) {
        return ['ok' => false, 'message' => 'Некоректна відповідь сервера ліцензій: ' . $response];
    }

    $decoded['_http_code'] = $httpCode;
    return $decoded;
}

$error = '';
$success = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['finish_install'])) {
    unset($_SESSION['install_complete']);
    header('Location: /');
    exit;
}

$defaults = [
    'db_host' => 'localhost',
    'db_name' => '',
    'db_user' => '',
    'db_pass' => '',
    'site_name' => 'Електронний журнал',
    'site_logo_name' => '',
    'admin_name' => '',
    'admin_email' => '',
    'admin_password' => '',
    'teacher_secret_word' => 'teacher2026',
    'license_key' => '',
    'product_slug' => 'journal-cms',
    'smtp_host' => 'smtp.gmail.com',
    'smtp_user' => '',
    'smtp_pass' => '',
    'smtp_port' => '587',
    'smtp_encryption' => 'tls',
    'smtp_from_email' => '',
    'smtp_from_name' => 'Електронний журнал',
    'smtp_reply_to' => '',
    'skip_mail' => '0',
];

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    foreach ($defaults as $key => $defaultValue) {
        $defaults[$key] = $key === 'skip_mail' ? (isset($_POST[$key]) ? '1' : '0') : post_value($key, (string)$defaultValue);
    }

    [$baseUrl, $domain] = build_base_url();
    $installId = bin2hex(random_bytes(16));
    $fingerprint = hash('sha256', $domain . '|' . PHP_VERSION . '|' . $rootDir . '|' . $installId);
    $apiUrl = 'https://sitepro.net.ua/license-center/api/license-hook.php';

    if ($defaults['license_key'] === '' || $defaults['product_slug'] === '') {
        $error = 'Вкажіть ліцензійний ключ і product slug.';
    } elseif ($defaults['db_name'] === '' || $defaults['db_user'] === '' || $defaults['admin_name'] === '' || $defaults['admin_email'] === '' || $defaults['admin_password'] === '') {
        $error = 'Заповніть усі обов’язкові поля.';
    } elseif (!filter_var($defaults['admin_email'], FILTER_VALIDATE_EMAIL)) {
        $error = 'Некоректний email адміністратора.';
    } elseif (mb_strlen($defaults['admin_password']) < 6) {
        $error = 'Пароль адміністратора має містити щонайменше 6 символів.';
    } else {
        $payload = [
            'action' => 'verify_install',
            'product_slug' => $defaults['product_slug'],
            'license_key' => $defaults['license_key'],
            'domain' => $domain,
            'base_url' => $baseUrl,
            'fingerprint' => $fingerprint,
            'install_id' => $installId,
            'php' => PHP_VERSION,
            'cms_version' => '5.0',
        ];

        $licenseResponse = send_license_request($apiUrl, $payload);
        if (empty($licenseResponse['ok']) || empty($licenseResponse['license_valid'])) {
            $error = (string)($licenseResponse['message'] ?? 'Ліцензія не підтверджена.');
        } else {
            mysqli_report(MYSQLI_REPORT_OFF);
            $conn = @new mysqli($defaults['db_host'], $defaults['db_user'], $defaults['db_pass'], $defaults['db_name']);
            if ($conn->connect_errno) {
                $error = 'Не вдалося підключитися до БД: ' . $conn->connect_error;
            } else {
                $conn->set_charset('utf8mb4');
                [$okImport, $importMessage] = import_sql($conn, $rootDir . '/install/data/schema.sql');
                if (!$okImport) {
                    $error = $importMessage;
                } else {
                    $passwordHash = password_hash($defaults['admin_password'], PASSWORD_DEFAULT);
                    $adminActive = 1;

                    $conn->begin_transaction();
                    try {
                        $stmtAdmin = $conn->prepare("INSERT INTO users (full_name, email, password, role, active, created_at, updated_at) VALUES (?, ?, ?, 'admin', ?, NOW(), NOW())");
                        if (!$stmtAdmin) {
                            throw new RuntimeException('Не вдалося підготувати створення адміністратора: ' . $conn->error);
                        }

                        $stmtAdmin->bind_param('sssi', $defaults['admin_name'], $defaults['admin_email'], $passwordHash, $adminActive);
                        if (!$stmtAdmin->execute()) {
                            throw new RuntimeException('Не вдалося створити адміністратора: ' . $stmtAdmin->error);
                        }
                        $stmtAdmin->close();

                        $adminId = (int)$conn->insert_id;
                        if ($adminId <= 0) {
                            throw new RuntimeException('Адміністратор не був створений у таблиці users.');
                        }

                        $verifyAdmin = $conn->prepare('SELECT id FROM users WHERE id = ? LIMIT 1');
                        if (!$verifyAdmin) {
                            throw new RuntimeException('Не вдалося перевірити створення адміністратора: ' . $conn->error);
                        }
                        $verifyAdmin->bind_param('i', $adminId);
                        $verifyAdmin->execute();
                        $verifyResult = $verifyAdmin->get_result();
                        $createdAdmin = $verifyResult ? $verifyResult->fetch_assoc() : null;
                        $verifyAdmin->close();
                        if (!$createdAdmin) {
                            throw new RuntimeException('Після створення адміністратора запис у users не знайдено.');
                        }

                        [$logoOk, $logoSaved, $logoError] = save_uploaded_logo($_FILES['site_logo'] ?? [], $rootDir . '/uploads/logo.png');
                        if (!$logoOk) {
                            throw new RuntimeException($logoError);
                        }

                        $settings = [
                            'teacher_secret_word' => $defaults['teacher_secret_word'],
                            'site_name' => $defaults['site_name'],
                            'site_logo' => '/uploads/logo.png',
                        ];
                        $stmtSetting = $conn->prepare('INSERT INTO settings (setting_name, setting_value) VALUES (?, ?)');
                        if ($stmtSetting) {
                            foreach ($settings as $settingName => $settingValue) {
                                $stmtSetting->bind_param('ss', $settingName, $settingValue);
                                if (!$stmtSetting->execute()) {
                                    throw new RuntimeException('Не вдалося зберегти налаштування ' . $settingName . ': ' . $stmtSetting->error);
                                }
                            }
                            $stmtSetting->close();
                        }

                        $conn->commit();

                        $mailEnabled = $defaults['skip_mail'] !== '1';
                        $appConfigData = [
                            'installed' => true,
                            'db' => [
                                'host' => $defaults['db_host'],
                                'name' => $defaults['db_name'],
                                'user' => $defaults['db_user'],
                                'pass' => $defaults['db_pass'],
                            ],
                            'branding' => [
                                'site_name' => $defaults['site_name'],
                                'site_logo' => '/uploads/logo.png',
                            ],
                            'mail' => [
                                'enabled' => $mailEnabled,
                                'host' => $defaults['smtp_host'],
                                'username' => $defaults['smtp_user'],
                                'password' => $defaults['smtp_pass'],
                                'port' => (int)$defaults['smtp_port'],
                                'encryption' => $defaults['smtp_encryption'],
                                'from_email' => $defaults['smtp_from_email'],
                                'from_name' => $defaults['smtp_from_name'],
                                'reply_to' => $defaults['smtp_reply_to'],
                            ],
                            'license' => [
                                'product_slug' => $defaults['product_slug'],
                                'license_key' => $defaults['license_key'],
                                'install_id' => $installId,
                                'installation_uid' => (string)($licenseResponse['installation_uid'] ?? ''),
                                'last_verify_at' => date('c'),
                                'last_status' => (string)($licenseResponse['license_status'] ?? ''),
                                'api_url' => $apiUrl,
                            ],
                        ];

                        if (!write_php_array_file($appConfigFile, $appConfigData)) {
                            throw new RuntimeException('Не вдалося записати includes/app_config.php');
                        }

                        @file_put_contents($rootDir . '/backups/license_state.json', json_encode([
                            'checked_at' => date('c'),
                            'ok' => !empty($licenseResponse['ok']),
                            'license_valid' => !empty($licenseResponse['license_valid']),
                            'license_status' => (string)($licenseResponse['license_status'] ?? ''),
                            'message' => (string)($licenseResponse['message'] ?? ''),
                        ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT));

                        $_SESSION['install_complete'] = [
                            'site_url' => $baseUrl,
                            'delete_paths' => [
                                '/install.php',
                                '/install/',
                            ],
                            'mail_skipped' => $defaults['skip_mail'] === '1',
                        ];

                        header('Location: ?done=1');
                        exit;
                    } catch (Throwable $e) {
                        $conn->rollback();
                        $error = $e->getMessage();
                    }
                }
                $conn->close();
            }
        }
    }
}
?>
<!doctype html>
<html lang="uk">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Установка CMS — Електронний журнал</title>
    <style>
        :root{
            --bg:#eef4ff;
            --card:#ffffff;
            --line:#d8e3f2;
            --text:#162033;
            --muted:#5f6f86;
            --primary:#315efb;
            --primary-dark:#2647c7;
            --soft:#f6f9ff;
            --ok-bg:#e9f9ef;
            --ok-text:#17653a;
            --err-bg:#fff0f0;
            --err-text:#b42318;
            --shadow:0 18px 54px rgba(49,94,251,.12);
        }
        *{box-sizing:border-box}
        body{margin:0;font-family:Arial,sans-serif;background:linear-gradient(180deg,#f4f8ff 0%,#eef3fb 100%);color:var(--text)}
        .wrap{max-width:1120px;margin:32px auto;padding:0 18px}
        .shell{display:grid;grid-template-columns:320px 1fr;gap:22px;align-items:start}
        .panel,.card{background:var(--card);border:1px solid var(--line);border-radius:24px;box-shadow:var(--shadow)}
        .panel{padding:24px;position:sticky;top:24px}
        .card{padding:28px}
        .logo{display:flex;align-items:center;gap:12px;margin-bottom:18px}
        .logo-badge{width:44px;height:44px;border-radius:14px;background:linear-gradient(135deg,var(--primary),#6a8bff);display:flex;align-items:center;justify-content:center;color:#fff;font-weight:700;font-size:20px}
        h1{font-size:30px;line-height:1.15;margin:0 0 10px}
        h2{font-size:24px;margin:0 0 10px}
        h3{font-size:17px;margin:0 0 14px}
        p{margin:0 0 14px;line-height:1.55}
        .muted{color:var(--muted)}
        .steps{display:flex;flex-direction:column;gap:12px;margin:22px 0}
        .step-item{display:flex;gap:12px;align-items:flex-start;padding:12px 14px;border-radius:16px;background:var(--soft);border:1px solid transparent}
        .step-item.is-active{background:#edf2ff;border-color:#bfd0ff}
        .step-item.is-done{background:#eefbf2;border-color:#c2eccf}
        .step-num{flex:0 0 34px;width:34px;height:34px;border-radius:999px;background:#dfe8ff;color:var(--primary);display:flex;align-items:center;justify-content:center;font-weight:700}
        .step-item.is-active .step-num{background:var(--primary);color:#fff}
        .step-item.is-done .step-num{background:#22a45d;color:#fff}
        .step-label{font-weight:700;margin-bottom:2px}
        .alert{border-radius:16px;padding:14px 16px;margin-bottom:18px;font-size:14px;line-height:1.5}
        .alert.error{background:var(--err-bg);color:var(--err-text);border:1px solid #ffd3d0}
        .alert.success{background:var(--ok-bg);color:var(--ok-text);border:1px solid #c7efda}
        .step-pane{display:none}
        .step-pane.is-active{display:block}
        .grid{display:grid;grid-template-columns:1fr 1fr;gap:18px}
        .full{grid-column:1 / -1}
        label{display:block;font-weight:700;margin-bottom:7px}
        input,select{width:100%;padding:13px 14px;border:1px solid #c9d5e5;border-radius:14px;background:#fff;color:var(--text);outline:none;transition:.2s}
        input:focus,select:focus{border-color:#8ca8ff;box-shadow:0 0 0 4px rgba(49,94,251,.10)}
        .hint{font-size:13px;color:var(--muted);line-height:1.5;margin-top:6px}
        .box{border:1px solid var(--line);background:var(--soft);border-radius:18px;padding:18px}
        .feature-list{margin:0;padding-left:18px;line-height:1.7;color:var(--muted)}
        .checkline{display:flex;align-items:flex-start;gap:10px;padding:14px 16px;border:1px solid var(--line);border-radius:16px;background:var(--soft)}
        .checkline input{width:auto;margin-top:2px}
        .nav{display:flex;justify-content:space-between;gap:12px;margin-top:26px;flex-wrap:wrap}
        .btn{appearance:none;border:none;border-radius:14px;padding:13px 18px;font-weight:700;font-size:15px;cursor:pointer;transition:.2s;text-decoration:none;display:inline-flex;align-items:center;justify-content:center}
        .btn-primary{background:var(--primary);color:#fff}
        .btn-primary:hover{background:var(--primary-dark)}
        .btn-secondary{background:#e9eef8;color:var(--text)}
        .btn-secondary:hover{background:#dde5f3}
        .summary{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:12px}
        .summary .box strong{display:block;margin-bottom:6px}
        .footer-note{margin-top:18px;color:var(--muted);font-size:13px}
        @media (max-width: 900px){
            .shell{grid-template-columns:1fr}
            .panel{position:static}
        }
        @media (max-width: 680px){
            .grid,.summary{grid-template-columns:1fr}
            .card,.panel{padding:20px}
            h1{font-size:26px}
        }
    </style>
</head>
<body>
<?php [$baseUrlPreview, $domainPreview] = build_base_url(); ?>
<div class="wrap">
    <div class="shell">
        <aside class="panel">
            <div class="logo">
                <div class="logo-badge">J</div>
                <div>
                    <div style="font-weight:700;font-size:18px">Electronic Journal CMS</div>
                    <div class="muted">Покрокова установка версії 5.0</div>
                </div>
            </div>
            <p>Інсталятор проведе по всіх етапах: перевірка ліцензії, база даних, адміністратор і пошта.</p>
            <div class="steps" id="stepsNav">
                <div class="step-item is-active" data-step-nav="1">
                    <div class="step-num">1</div>
                    <div><div class="step-label">Ліцензія та сайт</div><div class="muted">Ключ, slug і адреса установки</div></div>
                </div>
                <div class="step-item" data-step-nav="2">
                    <div class="step-num">2</div>
                    <div><div class="step-label">База даних</div><div class="muted">Підключення і імпорт структури</div></div>
                </div>
                <div class="step-item" data-step-nav="3">
                    <div class="step-num">3</div>
                    <div><div class="step-label">Адміністратор</div><div class="muted">Головний обліковий запис сайту</div></div>
                </div>
                <div class="step-item" data-step-nav="4">
                    <div class="step-num">4</div>
                    <div><div class="step-label">Пошта і запуск</div><div class="muted">SMTP і виконання установки</div></div>
                </div>
                <div class="step-item" data-step-nav="5">
                    <div class="step-num">5</div>
                    <div><div class="step-label">Завершення</div><div class="muted">Що видалити після інсталяції</div></div>
                </div>
            </div>
            <div class="box">
                <h3>Коротко про CMS</h3>
                <ul class="feature-list">
                    <li>електронний журнал для груп, учнів і викладачів</li>
                    <li>домашні завдання, оцінки та повідомлення</li>
                    <li>адмін-панель для керування системою</li>
                    <li>віддалена перевірка ліцензії під час установки</li>
                </ul>
            </div>
            <div class="footer-note">Поточний домен: <strong><?= h($domainPreview) ?></strong><br>Базова адреса: <strong><?= h($baseUrlPreview) ?></strong></div>
        </aside>

        <main class="card">
            <h1>Установка CMS “Електронний журнал”</h1>
            <p class="muted">Заповніть поля нижче. Установка пройде по кроках, а в кінці створить адміністратора, запише конфігурацію і підготує сайт до роботи.</p>

            <?php if ($error !== ''): ?>
                <div class="alert error"><?= h($error) ?></div>
            <?php endif; ?>
            <?php if ($success !== ''): ?>
                <div class="alert success"><?= h($success) ?></div>
            <?php endif; ?>

            <?php $finalData = is_array($installCompleteSession) ? $installCompleteSession : []; ?>

            <form method="post" id="installForm" enctype="multipart/form-data" novalidate>
                <section class="step-pane is-active" data-step="1">
                    <h2>Крок 1. Ліцензія та сайт</h2>
                    <div class="grid">
                        <div class="full">
                            <label for="license_key">Ліцензійний ключ</label>
                            <input id="license_key" name="license_key" value="<?= h($defaults['license_key']) ?>" required>
                            <div class="hint">Щоб отримати ліцензійний код, напишіть у Telegram: https://t.me/siteprocms</div>
                        </div>
                        <div>
                            <label for="product_slug">Product slug</label>
                            <input id="product_slug" name="product_slug" value="<?= h($defaults['product_slug']) ?>" required>
                            <div class="hint">Для цього пакета має бути slug вашого продукту в license center.</div>
                        </div>
                        <div>
                            <label>Адреса установки</label>
                            <input value="<?= h($baseUrlPreview) ?>" disabled>
                            <div class="hint">Домен і base URL визначаються автоматично з поточного сайту.</div>
                        </div>
                        <div class="full box">
                            <strong>Що буде перевірено</strong>
                            <div class="hint">Ключ, продукт, домен, install_id і допустимість нової активації на сервері ліцензій.</div>
                        </div>
                    </div>
                    <div class="nav">
                        <span></span>
                        <button type="button" class="btn btn-primary" data-next>Далі</button>
                    </div>
                </section>

                <section class="step-pane" data-step="2">
                    <h2>Крок 2. Підключення до бази даних</h2>
                    <div class="grid">
                        <div>
                            <label for="db_host">Хост БД</label>
                            <input id="db_host" name="db_host" value="<?= h($defaults['db_host']) ?>" required>
                        </div>
                        <div>
                            <label for="db_name">Назва БД</label>
                            <input id="db_name" name="db_name" value="<?= h($defaults['db_name']) ?>" required>
                        </div>
                        <div>
                            <label for="db_user">Користувач БД</label>
                            <input id="db_user" name="db_user" value="<?= h($defaults['db_user']) ?>" required>
                        </div>
                        <div>
                            <label for="db_pass">Пароль БД</label>
                            <input id="db_pass" name="db_pass" type="password" value="<?= h($defaults['db_pass']) ?>">
                        </div>
                        <div class="full box">
                            <strong>Що зробить інсталятор</strong>
                            <div class="hint">Підключиться до вказаної бази, імпортує чисту схему CMS і підготує таблиці для першого запуску.</div>
                        </div>
                    </div>
                    <div class="nav">
                        <button type="button" class="btn btn-secondary" data-prev>Назад</button>
                        <button type="button" class="btn btn-primary" data-next>Далі</button>
                    </div>
                </section>

                <section class="step-pane" data-step="3">
                    <h2>Крок 3. Головний адміністратор</h2>
                    <div class="grid">
                        <div>
                            <label for="site_name">Назва сайту</label>
                            <input id="site_name" name="site_name" value="<?= h($defaults['site_name']) ?>" required>
                        </div>
                        <div>
                            <label for="site_logo">Логотип сайту</label>
                            <input id="site_logo" name="site_logo" type="file" accept=".png,.jpg,.jpeg,.gif,.webp,image/png,image/jpeg,image/gif,image/webp">
                            <div class="hint">Необов’язково. Якщо завантажите логотип під час установки, він буде збережений у <strong>/uploads/logo.png</strong>.</div>
                        </div>
                        <div>
                            <label for="teacher_secret_word">Секретне слово для викладачів</label>
                            <input id="teacher_secret_word" name="teacher_secret_word" value="<?= h($defaults['teacher_secret_word']) ?>">
                        </div>
                        <div>
                            <label for="admin_name">Ім’я адміністратора</label>
                            <input id="admin_name" name="admin_name" value="<?= h($defaults['admin_name']) ?>" required>
                        </div>
                        <div>
                            <label for="admin_email">Email адміністратора</label>
                            <input id="admin_email" name="admin_email" type="email" value="<?= h($defaults['admin_email']) ?>" required>
                        </div>
                        <div class="full">
                            <label for="admin_password">Пароль адміністратора</label>
                            <input id="admin_password" name="admin_password" type="password" value="<?= h($defaults['admin_password']) ?>" required>
                            <div class="hint">Після установки цей користувач буде створений одразу в таблиці users і зможе увійти в систему.</div>
                        </div>
                    </div>
                    <div class="nav">
                        <button type="button" class="btn btn-secondary" data-prev>Назад</button>
                        <button type="button" class="btn btn-primary" data-next>Далі</button>
                    </div>
                </section>

                <section class="step-pane" data-step="4">
                    <h2>Крок 4. Пошта і завершення установки</h2>
                    <div class="grid">
                        <div>
                            <label for="smtp_host">SMTP хост</label>
                            <input id="smtp_host" name="smtp_host" value="<?= h($defaults['smtp_host']) ?>">
                        </div>
                        <div>
                            <label for="smtp_port">SMTP порт</label>
                            <input id="smtp_port" name="smtp_port" value="<?= h($defaults['smtp_port']) ?>">
                        </div>
                        <div>
                            <label for="smtp_user">SMTP логін</label>
                            <input id="smtp_user" name="smtp_user" value="<?= h($defaults['smtp_user']) ?>">
                        </div>
                        <div>
                            <label for="smtp_pass">SMTP пароль</label>
                            <input id="smtp_pass" name="smtp_pass" type="password" value="<?= h($defaults['smtp_pass']) ?>">
                        </div>
                        <div>
                            <label for="smtp_encryption">Шифрування</label>
                            <select id="smtp_encryption" name="smtp_encryption">
                                <option value="tls" <?= $defaults['smtp_encryption'] === 'tls' ? 'selected' : '' ?>>TLS</option>
                                <option value="ssl" <?= $defaults['smtp_encryption'] === 'ssl' ? 'selected' : '' ?>>SSL</option>
                                <option value="" <?= $defaults['smtp_encryption'] === '' ? 'selected' : '' ?>>Без шифрування</option>
                            </select>
                        </div>
                        <div>
                            <label for="smtp_from_email">Email відправника</label>
                            <input id="smtp_from_email" name="smtp_from_email" type="email" value="<?= h($defaults['smtp_from_email']) ?>">
                        </div>
                        <div>
                            <label for="smtp_from_name">Ім’я відправника</label>
                            <input id="smtp_from_name" name="smtp_from_name" value="<?= h($defaults['smtp_from_name']) ?>">
                        </div>
                        <div>
                            <label for="smtp_reply_to">Reply-To</label>
                            <input id="smtp_reply_to" name="smtp_reply_to" type="email" value="<?= h($defaults['smtp_reply_to']) ?>">
                        </div>
                        <div class="full">
                            <label class="checkline">
                                <input type="checkbox" name="skip_mail" value="1" <?= $defaults['skip_mail'] === '1' ? 'checked' : '' ?>>
                                <span>
                                    <strong>Пропустити налаштування пошти</strong><br>
                                    <span class="hint">Сайт встановиться і адміністратор буде створений, але листи з системи не працюватимуть, доки ви не налаштуєте SMTP.</span>
                                </span>
                            </label>
                        </div>
                    </div>

                    <div class="summary">
                        <div class="box">
                            <strong>Що буде записано</strong>
                            <div class="hint">includes/app_config.php, налаштування сайту, дані SMTP і стан ліцензії.</div>
                        </div>
                        <div class="box">
                            <strong>Результат</strong>
                            <div class="hint">Після завершення адміністратор уже буде створений у таблиці users.</div>
                        </div>
                    </div>

                    <div class="nav">
                        <button type="button" class="btn btn-secondary" data-prev>Назад</button>
                        <button type="submit" class="btn btn-primary">Виконати установку</button>
                    </div>
                </section>

                <section class="step-pane<?= $showFinalStep ? ' is-active' : '' ?>" data-step="5">
                    <h2>Крок 5. Завершення установки</h2>
                    <div class="alert success">Установка завершена успішно. Сайт уже готовий до роботи.</div>
                    <div class="summary">
                        <div class="box">
                            <strong>Що треба видалити після інсталяції</strong>
                            <div class="hint">
                                <?php foreach (($finalData['delete_paths'] ?? ['/install.php', '/install/']) as $deletePath): ?>
                                    <div><?= h($deletePath) ?></div>
                                <?php endforeach; ?>
                            </div>
                        </div>
                        <div class="box">
                            <strong>Далі</strong>
                            <div class="hint">
                                <?php if (!empty($finalData['mail_skipped'])): ?>
                                    SMTP поки що пропущено. Сайт працює, але для листів треба буде окремо налаштувати пошту.
                                <?php else: ?>
                                    Можете переходити на головну сторінку і входити під щойно створеним адміністратором.
                                <?php endif; ?>
                            </div>
                        </div>
                    </div>

                    <div class="nav">
                        <span></span>
                        <button type="submit" name="finish_install" value="1" class="btn btn-primary">Завершити</button>
                    </div>
                </section>
            </form>
        </main>
    </div>
</div>
<script>
(function(){
    const panes = Array.from(document.querySelectorAll('.step-pane'));
    const navItems = Array.from(document.querySelectorAll('[data-step-nav]'));
    let current = <?= $showFinalStep ? 4 : 0 ?>;

    const fieldGroups = {
        0: ['license_key', 'product_slug'],
        1: ['db_host', 'db_name', 'db_user'],
        2: ['site_name', 'admin_name', 'admin_email', 'admin_password'],
        3: [],
        4: []
    };

    function updateUI() {
        panes.forEach((pane, index) => pane.classList.toggle('is-active', index === current));
        navItems.forEach((item, index) => {
            item.classList.toggle('is-active', index === current);
            item.classList.toggle('is-done', index < current);
        });
    }

    function validateStep(index) {
        const ids = fieldGroups[index] || [];
        for (const id of ids) {
            const el = document.getElementById(id);
            if (!el) continue;
            if (!el.value.trim()) {
                el.focus();
                el.reportValidity?.();
                return false;
            }
            if (id === 'admin_email' && el.value.trim()) {
                const ok = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(el.value.trim());
                if (!ok) {
                    el.setCustomValidity('Вкажіть коректний email.');
                    el.reportValidity?.();
                    el.focus();
                    return false;
                }
                el.setCustomValidity('');
            }
            if (id === 'admin_password' && el.value.trim().length < 6) {
                el.setCustomValidity('Пароль має містити щонайменше 6 символів.');
                el.reportValidity?.();
                el.focus();
                return false;
            }
            el.setCustomValidity('');
        }
        return true;
    }

    document.querySelectorAll('[data-next]').forEach(btn => {
        btn.addEventListener('click', () => {
            if (!validateStep(current)) return;
            if (current < panes.length - 1) {
                current += 1;
                updateUI();
                window.scrollTo({top: 0, behavior: 'smooth'});
            }
        });
    });

    document.querySelectorAll('[data-prev]').forEach(btn => {
        btn.addEventListener('click', () => {
            if (current > 0) {
                current -= 1;
                updateUI();
                window.scrollTo({top: 0, behavior: 'smooth'});
            }
        });
    });

    navItems.forEach((item, index) => {
        item.addEventListener('click', () => {
            if (index <= current || validateStep(current)) {
                current = index;
                updateUI();
            }
        });
        item.style.cursor = 'pointer';
    });

    updateUI();
})();
</script>
</body>
</html>
