<?php
declare(strict_types=1);

session_start();

const INSTALL_LOCK_FILE = __DIR__ . '/.installed';
const INSTALL_SCHEMA_FILE = __DIR__ . '/install/data/schema.sql';
const LICENSE_API_URL = 'https://sitepro.net.ua/license-center/api/license-hook.php';
const LICENSE_PRODUCT_SLUG = 'vmeregi';

$__requestedStep = isset($_GET['step']) ? (int)$_GET['step'] : 1;
if (is_file(INSTALL_LOCK_FILE) && basename((string)($_SERVER['SCRIPT_NAME'] ?? '')) === 'install.php' && $__requestedStep !== 5) {
    header('Location: /');
    exit;
}

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

function current_step(): int
{
    $step = isset($_GET['step']) ? (int)$_GET['step'] : 1;
    if ($step < 1 || $step > 5) {
        $step = 1;
    }
    return $step;
}

function redirect_to_step(int $step): void
{
    header('Location: install.php?step=' . $step);
    exit;
}

function installer_csrf_token(): string
{
    $token = (string)($_SESSION['install_csrf'] ?? '');
    if ($token === '') {
        $token = bin2hex(random_bytes(32));
        $_SESSION['install_csrf'] = $token;
    }
    return $token;
}

function installer_csrf_check(?string $token): bool
{
    $expected = (string)($_SESSION['install_csrf'] ?? '');
    return $expected !== '' && is_string($token) && hash_equals($expected, $token);
}

function installer_host(): string
{
    return trim((string)($_SERVER['HTTP_HOST'] ?? 'localhost')) ?: 'localhost';
}

function installer_scheme(): string
{
    $https = (string)($_SERVER['HTTPS'] ?? '');
    $xfp = (string)($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? '');
    if (strtolower($https) === 'on' || $https === '1' || strtolower($xfp) === 'https') {
        return 'https';
    }
    return 'http';
}

function installer_base_url(): string
{
    return rtrim(installer_scheme() . '://' . installer_host(), '/');
}

function installer_domain(): string
{
    return preg_replace('~:\d+$~', '', installer_host()) ?: installer_host();
}

function installer_fingerprint(): string
{
    $parts = [
        installer_domain(),
        (string)php_uname('n'),
        (string)($_SERVER['SERVER_ADDR'] ?? ''),
        (string)($_SERVER['DOCUMENT_ROOT'] ?? ''),
    ];
    return hash('sha256', implode('|', $parts));
}

function installer_install_id(): string
{
    return hash('sha256', LICENSE_PRODUCT_SLUG . '|' . installer_domain() . '|' . (string)($_SERVER['DOCUMENT_ROOT'] ?? ''));
}

function installer_post_json(string $url, array $payload): array
{
    $json = json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    if (!is_string($json)) {
        throw new RuntimeException('Не вдалося підготувати JSON-запит до сервера ліцензій.');
    }

    if (function_exists('curl_init')) {
        $ch = curl_init($url);
        curl_setopt_array($ch, [
            CURLOPT_POST => true,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HTTPHEADER => [
                'Content-Type: application/json',
                'Accept: application/json',
            ],
            CURLOPT_POSTFIELDS => $json,
            CURLOPT_TIMEOUT => 25,
            CURLOPT_CONNECTTIMEOUT => 10,
            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) {
            throw new RuntimeException('Не вдалося з’єднатися з центром ліцензій: ' . $error);
        }
    } else {
        $context = stream_context_create([
            'http' => [
                'method' => 'POST',
                'header' => "Content-Type: application/json\r\nAccept: application/json\r\n",
                'content' => $json,
                'timeout' => 25,
                'ignore_errors' => true,
            ],
        ]);
        $response = @file_get_contents($url, false, $context);
        $httpCode = 0;
        if (isset($http_response_header) && is_array($http_response_header)) {
            foreach ($http_response_header as $line) {
                if (preg_match('~HTTP/\S+\s+(\d{3})~', $line, $m)) {
                    $httpCode = (int)$m[1];
                    break;
                }
            }
        }
        if ($response === false) {
            throw new RuntimeException('Не вдалося з’єднатися з центром ліцензій. Перевір доступ до інтернету на сервері.');
        }
    }

    $decoded = json_decode($response, true);
    if (!is_array($decoded)) {
        throw new RuntimeException('Центр ліцензій повернув некоректну відповідь.');
    }

    if ($httpCode >= 400) {
        $message = trim((string)($decoded['message'] ?? 'HTTP ' . $httpCode));
        throw new RuntimeException('Помилка центру ліцензій: ' . $message);
    }

    return $decoded;
}

function verify_license(string $licenseKey): array
{
    $payload = [
        'action'       => 'verify_install',
        'product_slug' => LICENSE_PRODUCT_SLUG,
        'license_key'  => $licenseKey,
        'domain'       => installer_domain(),
        'base_url'     => installer_base_url(),
        'fingerprint'  => installer_fingerprint(),
        'install_id'   => installer_install_id(),
    ];

    $response = installer_post_json(LICENSE_API_URL, $payload);
    $ok = (bool)($response['success'] ?? $response['ok'] ?? false);
    if (!$ok) {
        $message = trim((string)($response['message'] ?? 'Ліцензію не підтверджено.'));
        throw new RuntimeException($message);
    }

    return [
        'license_key' => $licenseKey,
        'response'    => $response,
        'verified_at' => date('c'),
        'domain'      => installer_domain(),
        'base_url'    => installer_base_url(),
        'fingerprint' => installer_fingerprint(),
        'install_id'  => installer_install_id(),
        'product_slug'=> LICENSE_PRODUCT_SLUG,
    ];
}

function installer_pdo(array $db): PDO
{
    $charset = trim((string)($db['charset'] ?? 'utf8mb4')) ?: 'utf8mb4';
    $host = trim((string)($db['host'] ?? '127.0.0.1')) ?: '127.0.0.1';
    $port = (int)($db['port'] ?? 3306);
    $name = trim((string)($db['name'] ?? ''));
    $user = trim((string)($db['user'] ?? ''));
    $pass = (string)($db['pass'] ?? '');
    if ($name === '' || $user === '') {
        throw new RuntimeException('Заповни всі обов’язкові дані підключення до БД.');
    }

    $dsn = sprintf('mysql:host=%s;port=%d;dbname=%s;charset=%s', $host, $port, $name, $charset);
    return new PDO($dsn, $user, $pass, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES => false,
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci',
    ]);
}

function import_schema(PDO $pdo, string $schemaFile): void
{
    if (!is_file($schemaFile)) {
        throw new RuntimeException('Не знайдено файл схеми БД для інсталяції.');
    }
    $sql = (string)file_get_contents($schemaFile);
    if (trim($sql) === '') {
        throw new RuntimeException('Файл схеми БД порожній.');
    }

    $pdo->exec($sql);
}

function insert_admin(PDO $pdo, array $admin): void
{
    $email = trim((string)($admin['email'] ?? ''));
    $username = trim((string)($admin['username'] ?? ''));
    $fullName = trim((string)($admin['full_name'] ?? ''));
    $password = (string)($admin['password'] ?? '');
    $lang = trim((string)($admin['lang'] ?? 'uk')) ?: 'uk';
    $gender = trim((string)($admin['gender'] ?? 'm')) ?: 'm';
    $now = date('Y-m-d H:i:s');

    if ($email === '' || $username === '' || $fullName === '' || $password === '') {
        throw new RuntimeException('Для створення адміністратора заповни всі обов’язкові поля.');
    }

    $exists = (int)$pdo->query('SELECT COUNT(*) FROM users')->fetchColumn();
    if ($exists > 0) {
        throw new RuntimeException('У таблиці users вже є записи. Для чистої інсталяції використай порожню базу даних.');
    }

    $stmt = $pdo->prepare(
        'INSERT INTO users (
            email, username, full_name, gender, birthdate, lang, pass_hash, role,
            is_active, activation_token_hash, activation_sent_at, activated_at, created_at,
            first_name, last_name, status, about, country, country_code, city,
            education, workplace, birth_date, sex, phone, website, work, languages,
            avatar_path, cover_path, updated_at, last_seen_at, is_private,
            vm_coins_balance, vm_coins_earned_total, vm_coins_spent_total, vm_coins_updated_at,
            vm_ref_code, vm_referred_by_user_id, vm_ref_applied_at
        ) VALUES (
            :email, :username, :full_name, :gender, NULL, :lang, :pass_hash, :role,
            :is_active, NULL, NULL, :activated_at, :created_at,
            NULL, NULL, NULL, NULL, NULL, NULL, NULL,
            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
            NULL, NULL, :updated_at, NULL, 0,
            0, 0, 0, NULL,
            NULL, NULL, NULL
        )'
    );

    $stmt->execute([
        ':email' => $email,
        ':username' => $username,
        ':full_name' => $fullName,
        ':gender' => in_array($gender, ['m', 'f'], true) ? $gender : 'm',
        ':lang' => in_array($lang, ['uk', 'en', 'ru'], true) ? $lang : 'uk',
        ':pass_hash' => password_hash($password, PASSWORD_DEFAULT),
        ':role' => 'admin',
        ':is_active' => 1,
        ':activated_at' => $now,
        ':created_at' => $now,
        ':updated_at' => $now,
    ]);

    $check = (int)$pdo->query('SELECT COUNT(*) FROM users')->fetchColumn();
    if ($check < 1) {
        throw new RuntimeException('Адміністратор не створився.');
    }
}

function upsert_app_setting(PDO $pdo, string $key, string $value): void
{
    $stmt = $pdo->prepare(
        'INSERT INTO app_settings (key_name, value_text, updated_at) VALUES (:key_name, :value_text, NOW())
         ON DUPLICATE KEY UPDATE value_text = VALUES(value_text), updated_at = VALUES(updated_at)'
    );
    $stmt->execute([
        ':key_name' => $key,
        ':value_text' => $value,
    ]);
}

function write_php_file(string $path, string $content): void
{
    $dir = dirname($path);
    if (!is_dir($dir) && !mkdir($dir, 0775, true) && !is_dir($dir)) {
        throw new RuntimeException('Не вдалося створити директорію: ' . $dir);
    }
    if (file_put_contents($path, $content) === false) {
        throw new RuntimeException('Не вдалося записати файл: ' . $path);
    }
}

function render_config_php(array $data): string
{
    $siteName = var_export((string)$data['site_name'], true);
    $baseUrl = var_export((string)$data['base_url'], true);
    $dbHost = var_export((string)$data['db']['host'], true);
    $dbName = var_export((string)$data['db']['name'], true);
    $dbUser = var_export((string)$data['db']['user'], true);
    $dbPass = var_export((string)$data['db']['pass'], true);
    $dbCharset = var_export((string)$data['db']['charset'], true);
    $dbPort = (int)$data['db']['port'];

    return <<<PHP
<?php
declare(strict_types=1);

/**
 * /includes/config.php
 * Автоматично створено installer-ом.
 */

function app_config(): array
{
    static \$cfg = null;
    if (is_array(\$cfg)) return \$cfg;

    \$cfg = [
        'app' => [
            'site_name'    => {$siteName},
            'default_lang' => 'uk',
            'langs'        => ['uk', 'en', 'ru'],
            'timezone'     => 'Europe/Kyiv',
            'base_url'     => {$baseUrl},
        ],
        'db' => [
            'host'    => {$dbHost},
            'name'    => {$dbName},
            'user'    => {$dbUser},
            'pass'    => {$dbPass},
            'port'    => {$dbPort},
            'charset' => {$dbCharset},
        ],
    ];

    return \$cfg;
}

return app_config();
PHP;
}

function render_config_mail_php(array $mail, string $siteName): string
{
    $host = var_export((string)($mail['host'] ?? ''), true);
    $username = var_export((string)($mail['username'] ?? ''), true);
    $password = var_export((string)($mail['password'] ?? ''), true);
    $port = (int)($mail['port'] ?? 587);
    $encryption = var_export((string)($mail['encryption'] ?? 'tls'), true);
    $fromEmail = var_export((string)($mail['from_email'] ?? ''), true);
    $fromName = var_export((string)($mail['from_name'] ?? $siteName), true);

    return <<<PHP
<?php

return [
    'host'       => {$host},
    'username'   => {$username},
    'password'   => {$password},
    'port'       => {$port},
    'encryption' => {$encryption},
    'from_email' => {$fromEmail},
    'from_name'  => {$fromName},
    'debug'      => 0,
    'debug_log'  => 'php_error_log',
];
PHP;
}

function render_license_php(array $license): string
{
    $export = var_export($license, true);
    return "<?php\n\nreturn " . $export . ";\n";
}

function save_logo_if_uploaded(string $field): ?string
{
    if (empty($_FILES[$field]) || !is_array($_FILES[$field])) {
        return null;
    }

    $file = $_FILES[$field];
    $error = (int)($file['error'] ?? UPLOAD_ERR_NO_FILE);
    if ($error === UPLOAD_ERR_NO_FILE) {
        return null;
    }
    if ($error !== UPLOAD_ERR_OK) {
        throw new RuntimeException('Не вдалося завантажити логотип.');
    }

    $tmp = (string)($file['tmp_name'] ?? '');
    if (!is_uploaded_file($tmp)) {
        throw new RuntimeException('Некоректне завантаження логотипа.');
    }

    $info = @getimagesize($tmp);
    if (!is_array($info) || empty($info['mime'])) {
        throw new RuntimeException('Логотип має бути зображенням JPG, PNG, GIF або WebP.');
    }

    $mime = strtolower((string)$info['mime']);
    $extMap = [
        'image/jpeg' => 'jpg',
        'image/png'  => 'png',
        'image/gif'  => 'gif',
        'image/webp' => 'webp',
    ];
    if (!isset($extMap[$mime])) {
        throw new RuntimeException('Підтримуються лише JPG, PNG, GIF або WebP.');
    }

    $dir = __DIR__ . '/uploads/site';
    if (!is_dir($dir) && !mkdir($dir, 0775, true) && !is_dir($dir)) {
        throw new RuntimeException('Не вдалося створити папку для логотипа.');
    }

    $relative = '/uploads/site/logo.' . $extMap[$mime];
    $absolute = __DIR__ . $relative;
    foreach (glob($dir . '/logo.*') ?: [] as $existing) {
        @unlink($existing);
    }
    if (!move_uploaded_file($tmp, $absolute)) {
        throw new RuntimeException('Не вдалося зберегти логотип.');
    }

    return $relative;
}

function finish_installation(array $payload): void
{
    write_php_file(__DIR__ . '/includes/config.php', render_config_php($payload));
    write_php_file(__DIR__ . '/includes/config_mail.php', render_config_mail_php($payload['mail'], (string)$payload['site_name']));
    write_php_file(__DIR__ . '/includes/license.php', render_license_php($payload['license']));
    write_php_file(__DIR__ . '/includes/install_bootstrap.php', "<?php\n\ndeclare(strict_types=1);\n\nfunction app_installation_meta(): array\n{\n    \\$file = __DIR__ . '/license.php';\n    if (!is_file(\\$file)) {\n        return [];\n    }\n    \\$data = require \\$file;\n    return is_array(\\$data) ? \\$data : [];\n}\n");

    $lock = [
        'installed_at' => date('c'),
        'product_slug' => LICENSE_PRODUCT_SLUG,
        'base_url'     => (string)$payload['base_url'],
        'domain'       => installer_domain(),
    ];
    file_put_contents(INSTALL_LOCK_FILE, json_encode($lock, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
}

$errors = [];
$success = '';
$step = current_step();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    try {
        if (!installer_csrf_check($_POST['csrf'] ?? null)) {
            throw new RuntimeException('Сесія застаріла. Онови сторінку та спробуй ще раз.');
        }

        if ($step === 1) {
            $licenseKey = trim((string)($_POST['license_key'] ?? ''));
            if ($licenseKey === '') {
                throw new RuntimeException('Введи ліцензійний ключ.');
            }
            $_SESSION['installer']['license'] = verify_license($licenseKey);
            redirect_to_step(2);
        }

        if ($step === 2) {
            $db = [
                'host'    => trim((string)($_POST['db_host'] ?? '127.0.0.1')) ?: '127.0.0.1',
                'port'    => (int)($_POST['db_port'] ?? 3306),
                'name'    => trim((string)($_POST['db_name'] ?? '')),
                'user'    => trim((string)($_POST['db_user'] ?? '')),
                'pass'    => (string)($_POST['db_pass'] ?? ''),
                'charset' => 'utf8mb4',
            ];
            $pdo = installer_pdo($db);
            import_schema($pdo, INSTALL_SCHEMA_FILE);
            $_SESSION['installer']['db'] = $db;
            redirect_to_step(3);
        }

        if ($step === 3) {
            $password = (string)($_POST['admin_password'] ?? '');
            $password2 = (string)($_POST['admin_password_confirm'] ?? '');
            if ($password === '' || strlen($password) < 6) {
                throw new RuntimeException('Пароль адміністратора має містити щонайменше 6 символів.');
            }
            if ($password !== $password2) {
                throw new RuntimeException('Паролі адміністратора не збігаються.');
            }

            $admin = [
                'email'     => trim((string)($_POST['admin_email'] ?? '')),
                'username'  => trim((string)($_POST['admin_username'] ?? '')),
                'full_name' => trim((string)($_POST['admin_full_name'] ?? '')),
                'password'  => $password,
                'lang'      => 'uk',
                'gender'    => in_array((string)($_POST['admin_gender'] ?? 'm'), ['m', 'f'], true) ? (string)$_POST['admin_gender'] : 'm',
            ];
            if (!filter_var($admin['email'], FILTER_VALIDATE_EMAIL)) {
                throw new RuntimeException('Вкажи коректний email адміністратора.');
            }
            if (!preg_match('~^[a-zA-Z0-9_\-.]{3,64}$~', $admin['username'])) {
                throw new RuntimeException('Логін адміністратора: 3-64 символи, лише латиниця, цифри, крапка, дефіс або підкреслення.');
            }

            $db = $_SESSION['installer']['db'] ?? null;
            if (!is_array($db)) {
                throw new RuntimeException('Спочатку заповни крок з базою даних.');
            }
            $pdo = installer_pdo($db);
            insert_admin($pdo, $admin);
            $_SESSION['installer']['admin'] = $admin;
            redirect_to_step(4);
        }

        if ($step === 4) {
            $siteName = trim((string)($_POST['site_name'] ?? ''));
            if ($siteName === '') {
                throw new RuntimeException('Вкажи назву сайту.');
            }

            $mailEnabled = (string)($_POST['mail_enabled'] ?? '0') === '1';
            $mail = [
                'host'       => trim((string)($_POST['mail_host'] ?? '')),
                'username'   => trim((string)($_POST['mail_username'] ?? '')),
                'password'   => (string)($_POST['mail_password'] ?? ''),
                'port'       => (int)($_POST['mail_port'] ?? 587),
                'encryption' => in_array((string)($_POST['mail_encryption'] ?? 'tls'), ['tls', 'ssl'], true) ? (string)$_POST['mail_encryption'] : 'tls',
                'from_email' => trim((string)($_POST['mail_from_email'] ?? '')),
                'from_name'  => trim((string)($_POST['mail_from_name'] ?? $siteName)) ?: $siteName,
            ];

            if ($mailEnabled) {
                foreach (['host', 'username', 'password', 'from_email'] as $required) {
                    if (trim((string)$mail[$required]) === '') {
                        throw new RuntimeException('Для SMTP заповни всі обов’язкові поштові поля.');
                    }
                }
                if (!filter_var($mail['from_email'], FILTER_VALIDATE_EMAIL)) {
                    throw new RuntimeException('Вкажи коректний email відправника.');
                }
            } else {
                $mail = [
                    'host' => '', 'username' => '', 'password' => '', 'port' => 587,
                    'encryption' => 'tls', 'from_email' => '', 'from_name' => $siteName,
                ];
            }

            $logoPath = save_logo_if_uploaded('site_logo');
            $baseUrl = installer_base_url();

            $_SESSION['installer']['site'] = [
                'site_name' => $siteName,
                'base_url'  => $baseUrl,
                'logo_path' => $logoPath,
                'mail'      => $mail,
                'mail_enabled' => $mailEnabled,
            ];

            $db = $_SESSION['installer']['db'] ?? null;
            $license = $_SESSION['installer']['license'] ?? null;
            if (!is_array($db) || !is_array($license)) {
                throw new RuntimeException('Не вистачає даних попередніх кроків. Почни встановлення заново.');
            }

            $pdo = installer_pdo($db);
            upsert_app_setting($pdo, 'site_name', $siteName);
            upsert_app_setting($pdo, 'site_base_url', $baseUrl);
            if (is_string($logoPath) && $logoPath !== '') {
                upsert_app_setting($pdo, 'site_logo_path', $logoPath);
            }

            finish_installation([
                'site_name' => $siteName,
                'base_url'  => $baseUrl,
                'db'        => $db,
                'mail'      => $mail,
                'license'   => $license,
            ]);

            redirect_to_step(5);
        }
    } catch (Throwable $e) {
        $errors[] = $e->getMessage();
    }
}

$installer = $_SESSION['installer'] ?? [];
$csrf = installer_csrf_token();
$siteData = is_array($installer['site'] ?? null) ? $installer['site'] : [];
$mailEnabledState = !empty($siteData['mail_enabled']);
?><!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:#0b1220;--card:#121a2b;--muted:#8da2c0;--text:#e8eef8;--accent:#4f8cff;--accent2:#6de1b8;--danger:#ff6b6b;--border:#22304b}
*{box-sizing:border-box} body{margin:0;font-family:Arial,Helvetica,sans-serif;background:linear-gradient(180deg,#0a1020,#131c31);color:var(--text)}
.wrap{max-width:980px;margin:0 auto;padding:32px 16px 64px}.card{background:rgba(18,26,43,.96);border:1px solid var(--border);border-radius:22px;box-shadow:0 20px 60px rgba(0,0,0,.35);overflow:hidden}
.hero{padding:28px 28px 16px;border-bottom:1px solid var(--border)} h1{margin:0 0 8px;font-size:32px} p{margin:0;color:var(--muted);line-height:1.55}.steps{display:grid;grid-template-columns:repeat(5,1fr);gap:10px;padding:20px 28px 0}.step{padding:12px;border:1px solid var(--border);border-radius:16px;text-align:center;color:var(--muted);font-size:13px}.step.active{background:rgba(79,140,255,.12);border-color:#3d68bb;color:#fff}.body{padding:28px}.grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.grid-1{display:grid;grid-template-columns:1fr;gap:16px}.field label{display:block;font-size:14px;font-weight:700;margin:0 0 8px}.field input,.field select{width:100%;padding:13px 14px;border-radius:14px;border:1px solid var(--border);background:#0b1220;color:#fff;outline:none}.field input[type=file]{padding:10px;background:#0b1220}.field small{display:block;color:var(--muted);margin-top:6px;line-height:1.45}.actions{display:flex;justify-content:space-between;gap:12px;align-items:center;margin-top:26px}.btn{appearance:none;border:0;border-radius:14px;padding:13px 18px;font-weight:700;cursor:pointer;text-decoration:none;display:inline-block}.btn-primary{background:var(--accent);color:#fff}.btn-secondary{background:#1a253b;color:#fff;border:1px solid var(--border)}.btn-success{background:var(--accent2);color:#06131a}.alert{padding:14px 16px;border-radius:14px;margin-bottom:16px;line-height:1.5}.alert-danger{background:rgba(255,107,107,.12);border:1px solid rgba(255,107,107,.45);color:#ffd3d3}.alert-info{background:rgba(79,140,255,.12);border:1px solid rgba(79,140,255,.35)}.alert-success{background:rgba(109,225,184,.12);border:1px solid rgba(109,225,184,.35)}.muted{color:var(--muted)}.check{margin:0 0 14px;padding:0;list-style:none}.check li{padding-left:22px;position:relative;margin-bottom:8px;color:#d7e4fb}.check li:before{content:'✓';position:absolute;left:0;top:0;color:var(--accent2);font-weight:700}.mail-box{padding:16px;border:1px solid var(--border);border-radius:18px;background:#0b1220}.switch{display:flex;align-items:center;gap:10px;margin-bottom:14px}.switch input{width:auto}.final-links{display:flex;flex-wrap:wrap;gap:10px;margin-top:18px}@media (max-width:780px){.steps,.grid{grid-template-columns:1fr}.actions{flex-direction:column;align-items:stretch}.hero,.body{padding:20px}}
</style>
</head>
<body>
<div class="wrap">
  <div class="card">
    <div class="hero">
      <h1>Встановлення VMEREGI</h1>
      <p>Основний функціонал движка: реєстрація та авторизація користувачів, профілі, стрічка публікацій, коментарі та реакції, друзі, групи, повідомлення, фотоальбоми, аудіо, відео, файли, дошка оголошень, пошук, сповіщення, внутрішні сторінки, реклама, VMCoins та адмін-панель для керування сайтом.</p>
    </div>
    <div class="steps">
      <?php foreach ([1=>'Ліцензія',2=>'База даних',3=>'Адміністратор',4=>'Сайт і пошта',5=>'Завершення'] as $n => $label): ?>
        <div class="step <?= $step === $n ? 'active' : '' ?>">Крок <?= $n ?><br><?= h($label) ?></div>
      <?php endforeach; ?>
    </div>
    <div class="body">
      <?php foreach ($errors as $error): ?>
        <div class="alert alert-danger"><?= h($error) ?></div>
      <?php endforeach; ?>

      <?php if ($step === 1): ?>
        <div class="alert alert-info">Щоб отримати ліцензійний код, напишіть у Telegram: <a href="https://t.me/siteprocms" target="_blank" rel="noopener"><strong>https://t.me/siteprocms</strong></a>. Вкажіть, яку саме CMS хочете придбати. Після цього з вами зв’яжеться адміністратор.</div>
        <ul class="check">
          <li>Архів уже завантажено на сервер.</li>
          <li>Перевірка виконується віддалено через центр ліцензій.</li>
          <li>Після успішної активації можна перейти до налаштування БД.</li>
        </ul>
        <form method="post" action="install.php?step=1">
          <input type="hidden" name="csrf" value="<?= h($csrf) ?>">
          <div class="grid-1">
            <div class="field">
              <label for="license_key">Ліцензійний ключ</label>
              <input id="license_key" name="license_key" type="text" value="<?= h((string)($installer['license']['license_key'] ?? '')) ?>" placeholder="Наприклад: XXXX-XXXX-XXXX-XXXX">
            </div>
          </div>
          <div class="actions">
            <span class="muted">Product slug: <?= h(LICENSE_PRODUCT_SLUG) ?></span>
            <button class="btn btn-primary" type="submit">Перевірити ліцензію</button>
          </div>
        </form>
      <?php elseif ($step === 2): ?>
        <div class="alert alert-info">На цьому кроці installer підключається до вказаної бази даних і імпортує схему з наданого дампа БД.</div>
        <form method="post" action="install.php?step=2">
          <input type="hidden" name="csrf" value="<?= h($csrf) ?>">
          <div class="grid">
            <div class="field"><label>Хост БД</label><input name="db_host" value="<?= h((string)($installer['db']['host'] ?? '127.0.0.1')) ?>"></div>
            <div class="field"><label>Порт БД</label><input name="db_port" type="number" value="<?= h((string)($installer['db']['port'] ?? '3306')) ?>"></div>
            <div class="field"><label>Назва БД</label><input name="db_name" value="<?= h((string)($installer['db']['name'] ?? '')) ?>"></div>
            <div class="field"><label>Користувач БД</label><input name="db_user" value="<?= h((string)($installer['db']['user'] ?? '')) ?>"></div>
            <div class="field" style="grid-column:1/-1"><label>Пароль БД</label><input name="db_pass" type="password" value="<?= h((string)($installer['db']['pass'] ?? '')) ?>"></div>
          </div>
          <div class="actions">
            <a class="btn btn-secondary" href="install.php?step=1">Назад</a>
            <button class="btn btn-primary" type="submit">Імпортувати структуру БД</button>
          </div>
        </form>
      <?php elseif ($step === 3): ?>
        <div class="alert alert-info">Installer створить першого адміністратора в таблиці <strong>users</strong> відповідно до реальної схеми з дампа.</div>
        <form method="post" action="install.php?step=3">
          <input type="hidden" name="csrf" value="<?= h($csrf) ?>">
          <div class="grid">
            <div class="field"><label>Email адміністратора</label><input name="admin_email" type="email" value="<?= h((string)($installer['admin']['email'] ?? '')) ?>"></div>
            <div class="field"><label>Логін адміністратора</label><input name="admin_username" value="<?= h((string)($installer['admin']['username'] ?? 'admin')) ?>"></div>
            <div class="field"><label>Ім’я та прізвище</label><input name="admin_full_name" value="<?= h((string)($installer['admin']['full_name'] ?? 'Адміністратор')) ?>"></div>
            <div class="field"><label>Стать</label><select name="admin_gender"><option value="m">Чоловіча</option><option value="f" <?= (($installer['admin']['gender'] ?? '') === 'f') ? 'selected' : '' ?>>Жіноча</option></select></div>
            <div class="field"><label>Пароль</label><input name="admin_password" type="password"></div>
            <div class="field"><label>Повторіть пароль</label><input name="admin_password_confirm" type="password"></div>
          </div>
          <div class="actions">
            <a class="btn btn-secondary" href="install.php?step=2">Назад</a>
            <button class="btn btn-primary" type="submit">Створити адміністратора</button>
          </div>
        </form>
      <?php elseif ($step === 4): ?>
        <div class="alert alert-info">Тут задається назва сайту, за потреби завантажується логотип і налаштовується SMTP. Пошту можна пропустити та налаштувати пізніше.</div>
        <form method="post" action="install.php?step=4" enctype="multipart/form-data">
          <input type="hidden" name="csrf" value="<?= h($csrf) ?>">
          <div class="grid">
            <div class="field"><label>Назва сайту</label><input name="site_name" value="<?= h((string)($siteData['site_name'] ?? 'VMEREGI')) ?>"></div>
            <div class="field"><label>Логотип сайту</label><input name="site_logo" type="file" accept="image/png,image/jpeg,image/gif,image/webp"><small>Необов’язково. Якщо завантажиш логотип, installer збереже його в <code>/uploads/site/</code>.</small></div>
          </div>
          <div class="mail-box">
            <div class="switch">
              <input id="mail_enabled" type="checkbox" name="mail_enabled" value="1" <?= $mailEnabledState ? 'checked' : '' ?> onclick="document.getElementById('mail_fields').style.display=this.checked?'grid':'none'">
              <label for="mail_enabled"><strong>Налаштувати SMTP зараз</strong></label>
            </div>
            <div class="alert alert-info" style="margin-top:0">Без SMTP сайт встановиться, але листи активації, відновлення пароля та інші email-сповіщення не працюватимуть, доки ти не заповниш поштовий конфіг.</div>
            <div id="mail_fields" class="grid" style="display:<?= $mailEnabledState ? 'grid' : 'none' ?>">
              <div class="field"><label>SMTP host</label><input name="mail_host" value="<?= h((string)($siteData['mail']['host'] ?? 'smtp.gmail.com')) ?>"></div>
              <div class="field"><label>SMTP port</label><input name="mail_port" type="number" value="<?= h((string)($siteData['mail']['port'] ?? '587')) ?>"></div>
              <div class="field"><label>SMTP login</label><input name="mail_username" value="<?= h((string)($siteData['mail']['username'] ?? '')) ?>"></div>
              <div class="field"><label>SMTP password</label><input name="mail_password" type="password" value="<?= h((string)($siteData['mail']['password'] ?? '')) ?>"></div>
              <div class="field"><label>Шифрування</label><select name="mail_encryption"><option value="tls">TLS</option><option value="ssl" <?= (($siteData['mail']['encryption'] ?? '') === 'ssl') ? 'selected' : '' ?>>SSL</option></select></div>
              <div class="field"><label>Email відправника</label><input name="mail_from_email" type="email" value="<?= h((string)($siteData['mail']['from_email'] ?? '')) ?>"></div>
              <div class="field" style="grid-column:1/-1"><label>Ім’я відправника</label><input name="mail_from_name" value="<?= h((string)($siteData['mail']['from_name'] ?? ($siteData['site_name'] ?? 'VMEREGI'))) ?>"></div>
            </div>
          </div>
          <div class="actions">
            <a class="btn btn-secondary" href="install.php?step=3">Назад</a>
            <button class="btn btn-success" type="submit">Завершити встановлення</button>
          </div>
        </form>
      <?php else: ?>
        <div class="alert alert-success">Встановлення завершено. Конфігурацію записано, ліцензію збережено локально, повторний запуск installer заблоковано.</div>
        <ul class="check">
          <li>Базу даних імпортовано.</li>
          <li>Адміністратора створено.</li>
          <li>Конфіг сайту та пошти збережено.</li>
          <li>Локальний файл інсталяції заблокував повторний запуск.</li>
        </ul>
        <div class="final-links">
          <a class="btn btn-success" href="/">Перейти на сайт</a>
          <a class="btn btn-secondary" href="/login.php">Увійти в акаунт</a>
          <a class="btn btn-secondary" href="/admin/index.php">Відкрити адмінку</a>
        </div>
      <?php endif; ?>
    </div>
  </div>
</div>
</body>
</html>
