<?php
declare(strict_types=1);

ini_set('display_errors', '1');
error_reporting(E_ALL);

session_start();

$timezone = 'America/Chicago';
date_default_timezone_set($timezone);

$baseDir = __DIR__;
$includesDir = $baseDir . '/includes';
$configFile = $includesDir . '/config.php';

$errors = [];
$success = false;
$installLocked = file_exists($configFile);

function h(string $value): string
{
    return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}

function clean_string(string $value): string
{
    return trim($value);
}

function write_config_file(string $filePath, array $config): bool
{
    $content = "<?php\n";
    $content .= "declare(strict_types=1);\n\n";
    $content .= "define('DB_HOST', " . var_export($config['db_host'], true) . ");\n";
    $content .= "define('DB_NAME', " . var_export($config['db_name'], true) . ");\n";
    $content .= "define('DB_USER', " . var_export($config['db_user'], true) . ");\n";
    $content .= "define('DB_PASS', " . var_export($config['db_pass'], true) . ");\n";
    $content .= "define('APP_NAME', 'StruvMail');\n";
    $content .= "define('APP_URL', " . var_export($config['app_url'], true) . ");\n";
    $content .= "define('APP_TIMEZONE', 'America/Chicago');\n";
    $content .= "define('APP_SUPPORT_EMAIL', 'support@struvarion.com');\n";
    $content .= "define('APP_FROM_NAME', 'StruvMail');\n";
    $content .= "define('APP_INSTALLED_AT', " . var_export(date('Y-m-d H:i:s'), true) . ");\n";

    return file_put_contents($filePath, $content, LOCK_EX) !== false;
}

function create_tables(PDO $pdo): void
{
    $queries = [];

    $queries[] = "
        CREATE TABLE IF NOT EXISTS users (
            id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            name VARCHAR(160) NOT NULL,
            email VARCHAR(190) NOT NULL UNIQUE,
            password_hash VARCHAR(255) NOT NULL,
            role ENUM('admin','user') NOT NULL DEFAULT 'user',
            status ENUM('active','paused') NOT NULL DEFAULT 'active',
            last_login_at DATETIME NULL,
            created_at DATETIME NOT NULL,
            updated_at DATETIME NOT NULL,
            INDEX idx_users_role (role),
            INDEX idx_users_status (status)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    ";

    $queries[] = "
        CREATE TABLE IF NOT EXISTS settings (
            id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            setting_key VARCHAR(120) NOT NULL UNIQUE,
            setting_value TEXT NULL,
            created_at DATETIME NOT NULL,
            updated_at DATETIME NOT NULL
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    ";

    $queries[] = "
        CREATE TABLE IF NOT EXISTS email_lists (
            id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            user_id INT UNSIGNED NOT NULL,
            name VARCHAR(160) NOT NULL,
            description TEXT NULL,
            status ENUM('active','archived') NOT NULL DEFAULT 'active',
            created_at DATETIME NOT NULL,
            updated_at DATETIME NOT NULL,
            INDEX idx_email_lists_user_id (user_id),
            INDEX idx_email_lists_status (status),
            CONSTRAINT fk_email_lists_user_id
                FOREIGN KEY (user_id) REFERENCES users(id)
                ON DELETE CASCADE
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    ";

    $queries[] = "
        CREATE TABLE IF NOT EXISTS subscribers (
            id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            user_id INT UNSIGNED NOT NULL,
            email VARCHAR(190) NOT NULL,
            first_name VARCHAR(120) NULL,
            last_name VARCHAR(120) NULL,
            phone VARCHAR(40) NULL,
            source VARCHAR(120) NULL,
            status ENUM('subscribed','unsubscribed','bounced','complained') NOT NULL DEFAULT 'subscribed',
            subscribed_at DATETIME NOT NULL,
            unsubscribed_at DATETIME NULL,
            created_at DATETIME NOT NULL,
            updated_at DATETIME NOT NULL,
            UNIQUE KEY uniq_user_subscriber_email (user_id, email),
            INDEX idx_subscribers_user_id (user_id),
            INDEX idx_subscribers_status (status),
            CONSTRAINT fk_subscribers_user_id
                FOREIGN KEY (user_id) REFERENCES users(id)
                ON DELETE CASCADE
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    ";

    $queries[] = "
        CREATE TABLE IF NOT EXISTS subscriber_lists (
            id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            subscriber_id INT UNSIGNED NOT NULL,
            list_id INT UNSIGNED NOT NULL,
            added_at DATETIME NOT NULL,
            UNIQUE KEY uniq_subscriber_list (subscriber_id, list_id),
            INDEX idx_subscriber_lists_subscriber_id (subscriber_id),
            INDEX idx_subscriber_lists_list_id (list_id),
            CONSTRAINT fk_subscriber_lists_subscriber_id
                FOREIGN KEY (subscriber_id) REFERENCES subscribers(id)
                ON DELETE CASCADE,
            CONSTRAINT fk_subscriber_lists_list_id
                FOREIGN KEY (list_id) REFERENCES email_lists(id)
                ON DELETE CASCADE
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    ";

    $queries[] = "
        CREATE TABLE IF NOT EXISTS email_templates (
            id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            user_id INT UNSIGNED NOT NULL,
            name VARCHAR(160) NOT NULL,
            subject VARCHAR(190) NOT NULL,
            body_html MEDIUMTEXT NOT NULL,
            body_text MEDIUMTEXT NULL,
            status ENUM('active','archived') NOT NULL DEFAULT 'active',
            created_at DATETIME NOT NULL,
            updated_at DATETIME NOT NULL,
            INDEX idx_email_templates_user_id (user_id),
            INDEX idx_email_templates_status (status),
            CONSTRAINT fk_email_templates_user_id
                FOREIGN KEY (user_id) REFERENCES users(id)
                ON DELETE CASCADE
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    ";

    $queries[] = "
        CREATE TABLE IF NOT EXISTS campaigns (
            id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            user_id INT UNSIGNED NOT NULL,
            list_id INT UNSIGNED NULL,
            template_id INT UNSIGNED NULL,
            name VARCHAR(160) NOT NULL,
            subject VARCHAR(190) NOT NULL,
            from_name VARCHAR(160) NOT NULL,
            from_email VARCHAR(190) NOT NULL,
            body_html MEDIUMTEXT NOT NULL,
            body_text MEDIUMTEXT NULL,
            status ENUM('draft','scheduled','sending','sent','paused','cancelled') NOT NULL DEFAULT 'draft',
            scheduled_at DATETIME NULL,
            sent_at DATETIME NULL,
            created_at DATETIME NOT NULL,
            updated_at DATETIME NOT NULL,
            INDEX idx_campaigns_user_id (user_id),
            INDEX idx_campaigns_list_id (list_id),
            INDEX idx_campaigns_template_id (template_id),
            INDEX idx_campaigns_status (status),
            CONSTRAINT fk_campaigns_user_id
                FOREIGN KEY (user_id) REFERENCES users(id)
                ON DELETE CASCADE,
            CONSTRAINT fk_campaigns_list_id
                FOREIGN KEY (list_id) REFERENCES email_lists(id)
                ON DELETE SET NULL,
            CONSTRAINT fk_campaigns_template_id
                FOREIGN KEY (template_id) REFERENCES email_templates(id)
                ON DELETE SET NULL
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    ";

    $queries[] = "
        CREATE TABLE IF NOT EXISTS email_queue (
            id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            campaign_id INT UNSIGNED NOT NULL,
            subscriber_id INT UNSIGNED NOT NULL,
            recipient_email VARCHAR(190) NOT NULL,
            subject VARCHAR(190) NOT NULL,
            body_html MEDIUMTEXT NOT NULL,
            body_text MEDIUMTEXT NULL,
            status ENUM('queued','processing','sent','failed','skipped') NOT NULL DEFAULT 'queued',
            attempts TINYINT UNSIGNED NOT NULL DEFAULT 0,
            last_error TEXT NULL,
            scheduled_at DATETIME NOT NULL,
            sent_at DATETIME NULL,
            created_at DATETIME NOT NULL,
            updated_at DATETIME NOT NULL,
            UNIQUE KEY uniq_campaign_subscriber (campaign_id, subscriber_id),
            INDEX idx_email_queue_status (status),
            INDEX idx_email_queue_scheduled_at (scheduled_at),
            CONSTRAINT fk_email_queue_campaign_id
                FOREIGN KEY (campaign_id) REFERENCES campaigns(id)
                ON DELETE CASCADE,
            CONSTRAINT fk_email_queue_subscriber_id
                FOREIGN KEY (subscriber_id) REFERENCES subscribers(id)
                ON DELETE CASCADE
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    ";

    $queries[] = "
        CREATE TABLE IF NOT EXISTS email_events (
            id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            campaign_id INT UNSIGNED NULL,
            subscriber_id INT UNSIGNED NULL,
            queue_id BIGINT UNSIGNED NULL,
            event_type ENUM('sent','opened','clicked','failed','unsubscribed','bounced','complained') NOT NULL,
            event_data JSON NULL,
            ip_address VARCHAR(45) NULL,
            user_agent TEXT NULL,
            created_at DATETIME NOT NULL,
            INDEX idx_email_events_campaign_id (campaign_id),
            INDEX idx_email_events_subscriber_id (subscriber_id),
            INDEX idx_email_events_queue_id (queue_id),
            INDEX idx_email_events_event_type (event_type),
            CONSTRAINT fk_email_events_campaign_id
                FOREIGN KEY (campaign_id) REFERENCES campaigns(id)
                ON DELETE SET NULL,
            CONSTRAINT fk_email_events_subscriber_id
                FOREIGN KEY (subscriber_id) REFERENCES subscribers(id)
                ON DELETE SET NULL,
            CONSTRAINT fk_email_events_queue_id
                FOREIGN KEY (queue_id) REFERENCES email_queue(id)
                ON DELETE SET NULL
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    ";

    $queries[] = "
        CREATE TABLE IF NOT EXISTS unsubscribe_tokens (
            id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            subscriber_id INT UNSIGNED NOT NULL,
            token VARCHAR(128) NOT NULL UNIQUE,
            expires_at DATETIME NULL,
            used_at DATETIME NULL,
            created_at DATETIME NOT NULL,
            INDEX idx_unsubscribe_tokens_subscriber_id (subscriber_id),
            INDEX idx_unsubscribe_tokens_token (token),
            CONSTRAINT fk_unsubscribe_tokens_subscriber_id
                FOREIGN KEY (subscriber_id) REFERENCES subscribers(id)
                ON DELETE CASCADE
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    ";

    $queries[] = "
        CREATE TABLE IF NOT EXISTS password_resets (
            id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            user_id INT UNSIGNED NOT NULL,
            token VARCHAR(128) NOT NULL UNIQUE,
            expires_at DATETIME NOT NULL,
            used_at DATETIME NULL,
            created_at DATETIME NOT NULL,
            INDEX idx_password_resets_user_id (user_id),
            INDEX idx_password_resets_token (token),
            CONSTRAINT fk_password_resets_user_id
                FOREIGN KEY (user_id) REFERENCES users(id)
                ON DELETE CASCADE
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    ";

    $queries[] = "
        CREATE TABLE IF NOT EXISTS activity_logs (
            id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            user_id INT UNSIGNED NULL,
            action VARCHAR(160) NOT NULL,
            description TEXT NULL,
            ip_address VARCHAR(45) NULL,
            user_agent TEXT NULL,
            created_at DATETIME NOT NULL,
            INDEX idx_activity_logs_user_id (user_id),
            INDEX idx_activity_logs_action (action),
            CONSTRAINT fk_activity_logs_user_id
                FOREIGN KEY (user_id) REFERENCES users(id)
                ON DELETE SET NULL
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    ";

    foreach ($queries as $query) {
        $pdo->exec($query);
    }
}

function seed_settings(PDO $pdo, string $appUrl): void
{
    $now = date('Y-m-d H:i:s');

    $settings = [
        'app_name' => 'StruvMail',
        'app_url' => $appUrl,
        'support_email' => 'support@struvarion.com',
        'from_name' => 'StruvMail',
        'from_email' => 'support@struvarion.com',
        'daily_send_limit' => '500',
        'install_status' => 'complete',
    ];

    $stmt = $pdo->prepare("
        INSERT INTO settings (setting_key, setting_value, created_at, updated_at)
        VALUES (:setting_key, :setting_value, :created_at, :updated_at)
        ON DUPLICATE KEY UPDATE
            setting_value = VALUES(setting_value),
            updated_at = VALUES(updated_at)
    ");

    foreach ($settings as $key => $value) {
        $stmt->execute([
            ':setting_key' => $key,
            ':setting_value' => $value,
            ':created_at' => $now,
            ':updated_at' => $now,
        ]);
    }
}

function create_admin_user(PDO $pdo, string $name, string $email, string $password): void
{
    $now = date('Y-m-d H:i:s');
    $hash = password_hash($password, PASSWORD_DEFAULT);

    $stmt = $pdo->prepare("
        INSERT INTO users (name, email, password_hash, role, status, created_at, updated_at)
        VALUES (:name, :email, :password_hash, 'admin', 'active', :created_at, :updated_at)
        ON DUPLICATE KEY UPDATE
            name = VALUES(name),
            password_hash = VALUES(password_hash),
            role = 'admin',
            status = 'active',
            updated_at = VALUES(updated_at)
    ");

    $stmt->execute([
        ':name' => $name,
        ':email' => $email,
        ':password_hash' => $hash,
        ':created_at' => $now,
        ':updated_at' => $now,
    ]);
}

if ($_SERVER['REQUEST_METHOD'] === 'POST' && !$installLocked) {
    $dbHost = clean_string($_POST['db_host'] ?? '');
    $dbName = clean_string($_POST['db_name'] ?? '');
    $dbUser = clean_string($_POST['db_user'] ?? '');
    $dbPass = (string)($_POST['db_pass'] ?? '');
    $appUrl = rtrim(clean_string($_POST['app_url'] ?? 'https://struvmail.com'), '/');

    $adminName = clean_string($_POST['admin_name'] ?? '');
    $adminEmail = strtolower(clean_string($_POST['admin_email'] ?? ''));
    $adminPassword = (string)($_POST['admin_password'] ?? '');
    $adminPasswordConfirm = (string)($_POST['admin_password_confirm'] ?? '');

    if ($dbHost === '') {
        $errors[] = 'Database host is required.';
    }

    if ($dbName === '') {
        $errors[] = 'Database name is required.';
    }

    if ($dbUser === '') {
        $errors[] = 'Database user is required.';
    }

    if ($appUrl === '' || !filter_var($appUrl, FILTER_VALIDATE_URL)) {
        $errors[] = 'A valid App URL is required.';
    }

    if ($adminName === '') {
        $errors[] = 'Admin name is required.';
    }

    if (!filter_var($adminEmail, FILTER_VALIDATE_EMAIL)) {
        $errors[] = 'A valid admin email is required.';
    }

    if (strlen($adminPassword) < 8) {
        $errors[] = 'Admin password must be at least 8 characters.';
    }

    if ($adminPassword !== $adminPasswordConfirm) {
        $errors[] = 'Admin passwords do not match.';
    }

    if (!$errors) {
        try {
            if (!is_dir($includesDir) && !mkdir($includesDir, 0755, true)) {
                throw new RuntimeException('Could not create includes directory.');
            }

            $dsn = "mysql:host={$dbHost};dbname={$dbName};charset=utf8mb4";

            $pdo = new PDO($dsn, $dbUser, $dbPass, [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_EMULATE_PREPARES => false,
            ]);

            create_tables($pdo);
            seed_settings($pdo, $appUrl);
            create_admin_user($pdo, $adminName, $adminEmail, $adminPassword);

            $logStmt = $pdo->prepare("
                INSERT INTO activity_logs (user_id, action, description, ip_address, user_agent, created_at)
                VALUES (NULL, 'system_installed', 'StruvMail was installed successfully.', :ip_address, :user_agent, :created_at)
            ");

            $logStmt->execute([
                ':ip_address' => $_SERVER['REMOTE_ADDR'] ?? null,
                ':user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? null,
                ':created_at' => date('Y-m-d H:i:s'),
            ]);

            $configWritten = write_config_file($configFile, [
                'db_host' => $dbHost,
                'db_name' => $dbName,
                'db_user' => $dbUser,
                'db_pass' => $dbPass,
                'app_url' => $appUrl,
            ]);

            if (!$configWritten) {
                $errors[] = 'Tables were created, but config.php could not be written. Check folder permissions.';
            } else {
                $success = true;
                $installLocked = true;
            }
        } catch (Throwable $e) {
            $errors[] = 'Install failed: ' . $e->getMessage();
        }
    }
}

$defaultAppUrl = 'https://struvmail.com';
?>
<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Install StruvMail</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>
        :root {
            --bg: #050505;
            --panel: #111111;
            --panel2: #171717;
            --gold: #d6aa45;
            --gold2: #f2d27a;
            --text: #f5f5f5;
            --muted: #b7b7b7;
            --danger: #ff6b6b;
            --success: #55d187;
            --border: rgba(214, 170, 69, 0.28);
            --shadow: rgba(0, 0, 0, 0.55);
        }

        * {
            box-sizing: border-box;
        }

        body {
            margin: 0;
            min-height: 100vh;
            font-family: Arial, Helvetica, sans-serif;
            background:
                radial-gradient(circle at top left, rgba(214, 170, 69, 0.16), transparent 32%),
                radial-gradient(circle at bottom right, rgba(214, 170, 69, 0.11), transparent 36%),
                var(--bg);
            color: var(--text);
        }

        .wrap {
            width: min(1080px, calc(100% - 32px));
            margin: 0 auto;
            padding: 42px 0;
        }

        .hero {
            display: grid;
            grid-template-columns: 1fr;
            gap: 18px;
            margin-bottom: 26px;
        }

        .brand {
            display: inline-flex;
            align-items: center;
            gap: 12px;
            color: var(--gold2);
            font-weight: 800;
            letter-spacing: 0.12em;
            text-transform: uppercase;
            font-size: 13px;
        }

        .mark {
            width: 38px;
            height: 38px;
            border: 1px solid var(--border);
            border-radius: 14px;
            display: grid;
            place-items: center;
            background: linear-gradient(145deg, rgba(214, 170, 69, 0.22), rgba(255,255,255,0.03));
            box-shadow: 0 12px 28px var(--shadow);
        }

        h1 {
            margin: 0;
            font-size: clamp(34px, 5vw, 58px);
            line-height: 1.02;
            letter-spacing: -0.05em;
        }

        .lead {
            margin: 0;
            max-width: 720px;
            color: var(--muted);
            font-size: 18px;
            line-height: 1.55;
        }

        .grid {
            display: grid;
            grid-template-columns: 1fr;
            gap: 22px;
        }

        @media (min-width: 920px) {
            .grid {
                grid-template-columns: 1.15fr 0.85fr;
                align-items: start;
            }
        }

        .card {
            border: 1px solid var(--border);
            background: linear-gradient(180deg, rgba(255,255,255,0.045), rgba(255,255,255,0.018));
            border-radius: 24px;
            box-shadow: 0 24px 70px var(--shadow);
            overflow: hidden;
        }

        .card-header {
            padding: 22px 24px;
            border-bottom: 1px solid rgba(214, 170, 69, 0.18);
            background: rgba(0,0,0,0.18);
        }

        .card-header h2 {
            margin: 0 0 6px;
            font-size: 22px;
            letter-spacing: -0.03em;
        }

        .card-header p {
            margin: 0;
            color: var(--muted);
            line-height: 1.45;
        }

        .card-body {
            padding: 24px;
        }

        .section-title {
            margin: 24px 0 12px;
            color: var(--gold2);
            font-size: 13px;
            letter-spacing: 0.12em;
            text-transform: uppercase;
            font-weight: 800;
        }

        .section-title:first-child {
            margin-top: 0;
        }

        .field {
            margin-bottom: 16px;
        }

        label {
            display: block;
            margin-bottom: 7px;
            color: #ffffff;
            font-size: 14px;
            font-weight: 700;
        }

        input {
            width: 100%;
            min-height: 48px;
            padding: 12px 14px;
            border-radius: 14px;
            border: 1px solid rgba(255,255,255,0.13);
            background: rgba(0,0,0,0.36);
            color: var(--text);
            outline: none;
            font-size: 15px;
        }

        input:focus {
            border-color: var(--gold);
            box-shadow: 0 0 0 4px rgba(214,170,69,0.12);
        }

        .row {
            display: grid;
            grid-template-columns: 1fr;
            gap: 16px;
        }

        @media (min-width: 720px) {
            .row {
                grid-template-columns: 1fr 1fr;
            }
        }

        .btn {
            width: 100%;
            margin-top: 10px;
            border: 0;
            border-radius: 16px;
            padding: 15px 18px;
            background: linear-gradient(135deg, var(--gold2), var(--gold));
            color: #101010;
            font-size: 16px;
            font-weight: 900;
            cursor: pointer;
            box-shadow: 0 16px 36px rgba(214, 170, 69, 0.18);
        }

        .btn:hover {
            filter: brightness(1.04);
        }

        .notice {
            padding: 15px 16px;
            border-radius: 16px;
            margin-bottom: 18px;
            line-height: 1.45;
        }

        .notice.error {
            border: 1px solid rgba(255,107,107,0.4);
            background: rgba(255,107,107,0.09);
            color: #ffd5d5;
        }

        .notice.success {
            border: 1px solid rgba(85,209,135,0.38);
            background: rgba(85,209,135,0.09);
            color: #d6ffe5;
        }

        .notice.locked {
            border: 1px solid rgba(214,170,69,0.38);
            background: rgba(214,170,69,0.09);
            color: #ffe8a8;
        }

        .list {
            display: grid;
            gap: 12px;
            margin: 0;
            padding: 0;
            list-style: none;
        }

        .list li {
            padding: 14px 15px;
            border: 1px solid rgba(255,255,255,0.08);
            background: rgba(0,0,0,0.25);
            border-radius: 16px;
            color: var(--muted);
            line-height: 1.45;
        }

        .list strong {
            color: var(--text);
        }

        .footer-note {
            margin-top: 18px;
            color: #8f8f8f;
            font-size: 13px;
            line-height: 1.45;
        }

        a {
            color: var(--gold2);
            text-decoration: none;
            font-weight: 800;
        }

        a:hover {
            text-decoration: underline;
        }

        .mini {
            color: var(--muted);
            font-size: 13px;
            margin-top: 6px;
            line-height: 1.4;
        }
    </style>
</head>
<body>
<div class="wrap">
    <div class="hero">
        <div class="brand">
            <div class="mark">✉</div>
            StruvMail Installer
        </div>
        <h1>Basic Mailchimp-style mailer. Clean. Fast. Yours.</h1>
        <p class="lead">
            This installs the StruvMail foundation: users, lists, subscribers, campaigns, templates,
            email queue, events, unsubscribe tokens, settings, and activity logs.
        </p>
    </div>

    <div class="grid">
        <div class="card">
            <div class="card-header">
                <h2>Install StruvMail</h2>
                <p>Enter the database details you created in cPanel and create the first admin account.</p>
            </div>

            <div class="card-body">
                <?php if ($success): ?>
                    <div class="notice success">
                        <strong>Installed successfully.</strong><br>
                        StruvMail tables were created and the admin account is ready.
                    </div>
                <?php endif; ?>

                <?php if ($installLocked): ?>
                    <div class="notice locked">
                        <strong>Installer locked.</strong><br>
                        The config file already exists at <strong>/includes/config.php</strong>.
                        For safety, this installer will not run again unless that file is removed manually.
                    </div>
                <?php endif; ?>

                <?php if ($errors): ?>
                    <div class="notice error">
                        <strong>Fix this first:</strong>
                        <ul>
                            <?php foreach ($errors as $error): ?>
                                <li><?= h($error); ?></li>
                            <?php endforeach; ?>
                        </ul>
                    </div>
                <?php endif; ?>

                <?php if (!$installLocked): ?>
                    <form method="post" action="">
                        <div class="section-title">Database</div>

                        <div class="row">
                            <div class="field">
                                <label for="db_host">Database Host</label>
                                <input id="db_host" name="db_host" type="text" value="<?= h($_POST['db_host'] ?? 'localhost'); ?>" required>
                            </div>

                            <div class="field">
                                <label for="db_name">Database Name</label>
                                <input id="db_name" name="db_name" type="text" value="<?= h($_POST['db_name'] ?? ''); ?>" required>
                            </div>
                        </div>

                        <div class="row">
                            <div class="field">
                                <label for="db_user">Database User</label>
                                <input id="db_user" name="db_user" type="text" value="<?= h($_POST['db_user'] ?? ''); ?>" required>
                            </div>

                            <div class="field">
                                <label for="db_pass">Database Password</label>
                                <input id="db_pass" name="db_pass" type="password" value="<?= h($_POST['db_pass'] ?? ''); ?>">
                            </div>
                        </div>

                        <div class="field">
                            <label for="app_url">App URL</label>
                            <input id="app_url" name="app_url" type="url" value="<?= h($_POST['app_url'] ?? $defaultAppUrl); ?>" required>
                            <div class="mini">Use the live domain, no trailing slash.</div>
                        </div>

                        <div class="section-title">First Admin</div>

                        <div class="row">
                            <div class="field">
                                <label for="admin_name">Admin Name</label>
                                <input id="admin_name" name="admin_name" type="text" value="<?= h($_POST['admin_name'] ?? 'Kerry Miller'); ?>" required>
                            </div>

                            <div class="field">
                                <label for="admin_email">Admin Email</label>
                                <input id="admin_email" name="admin_email" type="email" value="<?= h($_POST['admin_email'] ?? 'support@struvarion.com'); ?>" required>
                            </div>
                        </div>

                        <div class="row">
                            <div class="field">
                                <label for="admin_password">Admin Password</label>
                                <input id="admin_password" name="admin_password" type="password" required>
                            </div>

                            <div class="field">
                                <label for="admin_password_confirm">Confirm Password</label>
                                <input id="admin_password_confirm" name="admin_password_confirm" type="password" required>
                            </div>
                        </div>

                        <button class="btn" type="submit">Install StruvMail</button>
                    </form>
                <?php endif; ?>

                <div class="footer-note">
                    After install, leave this file in place only while building. Once login is working,
                    delete or rename <strong>install.php</strong>. That’s the safety belt — not decoration.
                </div>
            </div>
        </div>

        <div class="card">
            <div class="card-header">
                <h2>System Tracking</h2>
                <p>Project build status. One file. No chaos. Everybody breathe.</p>
            </div>

            <div class="card-body">
                <ul class="list">
                    <li><strong>Project:</strong><br>StruvMail Mailer System</li>
                    <li><strong>Current Phase:</strong><br>Setup Fix</li>
                    <li><strong>Completed Files:</strong><br>install.php, includes/db.php, login.php, logout.php, account/index.php, account/lists.php</li>
                    <li><strong>Active File:</strong><br>/home3/gitdigic/struvmail.com/install.php</li>
                    <li><strong>Next File Queue:</strong><br>1. /home3/gitdigic/struvmail.com/account/subscribers.php</li>
                    <li><strong>Known Issues:</strong><br>Removed installer transaction wrapper because CREATE TABLE statements auto-commit in MySQL.</li>
                </ul>
            </div>
        </div>
    </div>
</div>
</body>
</html>