<?php
/**
 * iGamingApi - Enterprise iGaming GGR Client Management System
 * Installation Wizard v1.0.0
 * 
 * Self-contained installer with embedded HTML/CSS/JS
 * Black & Gold luxury theme
 */

// Error reporting for installation
error_reporting(E_ALL);
ini_set('display_errors', 0);

// Define base path
define('BASE_PATH', __DIR__);
define('CONFIG_PATH', BASE_PATH . DIRECTORY_SEPARATOR . 'config');
define('CONFIG_FILE', CONFIG_PATH . DIRECTORY_SEPARATOR . 'config.php');
define('STORAGE_PATH', BASE_PATH . DIRECTORY_SEPARATOR . 'storage');
define('DATABASE_PATH', BASE_PATH . DIRECTORY_SEPARATOR . 'database');
define('SCHEMA_FILE', DATABASE_PATH . DIRECTORY_SEPARATOR . 'schema.sql');

// ============================================================
// SECURITY CHECK: Block if already installed
// ============================================================
$alreadyInstalled = file_exists(CONFIG_FILE);

// ============================================================
// AJAX HANDLER: Process server-side actions
// ============================================================
if (isset($_POST['action'])) {
    header('Content-Type: application/json');

    // Block all actions if already installed
    if ($alreadyInstalled) {
        echo json_encode(['success' => false, 'message' => 'System is already installed. Remove config/config.php to reinstall.']);
        exit;
    }

    $action = $_POST['action'];

    // ---- ACTION: Test Database Connection ----
    if ($action === 'test_db') {
        $host = trim($_POST['db_host'] ?? 'localhost');
        $name = trim($_POST['db_name'] ?? '');
        $user = trim($_POST['db_user'] ?? '');
        $pass = $_POST['db_pass'] ?? '';
        $port = intval($_POST['db_port'] ?? 3306);
        $createDb = isset($_POST['create_db']) && $_POST['create_db'] === '1';

        if (empty($host) || empty($name) || empty($user)) {
            echo json_encode(['success' => false, 'message' => 'Please fill in all required database fields.']);
            exit;
        }

        try {
            // First try connecting without database name
            $dsn = "mysql:host={$host};port={$port};charset=utf8mb4";
            $pdo = new PDO($dsn, $user, $pass, [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_TIMEOUT => 5,
            ]);

            // Check if database exists
            $stmt = $pdo->prepare("SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = ?");
            $stmt->execute([$name]);
            $dbExists = $stmt->fetch();

            if (!$dbExists) {
                if ($createDb) {
                    $safeName = preg_replace('/[^a-zA-Z0-9_]/', '', $name);
                    $pdo->exec("CREATE DATABASE `{$safeName}` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
                    echo json_encode(['success' => true, 'message' => "Database '{$safeName}' created successfully and connection verified."]);
                } else {
                    echo json_encode(['success' => false, 'message' => "Database '{$name}' does not exist. Enable 'Create database if not exists' option."]);
                }
            } else {
                // Try connecting to the specific database
                $dsn = "mysql:host={$host};port={$port};dbname={$name};charset=utf8mb4";
                $pdo2 = new PDO($dsn, $user, $pass, [
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                ]);
                echo json_encode(['success' => true, 'message' => 'Database connection successful!']);
            }
        } catch (PDOException $e) {
            $msg = $e->getMessage();
            // Sanitize error message
            $msg = str_replace($pass, '***', $msg);
            echo json_encode(['success' => false, 'message' => 'Connection failed: ' . $msg]);
        }
        exit;
    }

    // ---- ACTION: Run Installation ----
    if ($action === 'install') {
        $response = ['success' => false, 'message' => '', 'step' => 0];

        // Collect all data
        $dbHost = trim($_POST['db_host'] ?? 'localhost');
        $dbName = trim($_POST['db_name'] ?? '');
        $dbUser = trim($_POST['db_user'] ?? '');
        $dbPass = $_POST['db_pass'] ?? '';
        $dbPort = intval($_POST['db_port'] ?? 3306);

        $appUrl = rtrim(trim($_POST['app_url'] ?? ''), '/');
        $appName = trim($_POST['app_name'] ?? 'iGamingApi');
        $defaultCurrency = trim($_POST['default_currency'] ?? 'INR');
        $timezone = trim($_POST['timezone'] ?? 'Asia/Kolkata');

        $adminUser = trim($_POST['admin_username'] ?? '');
        $adminEmail = trim($_POST['admin_email'] ?? '');
        $adminPass = $_POST['admin_password'] ?? '';

        // Validate required fields
        if (empty($dbHost) || empty($dbName) || empty($dbUser)) {
            $response['message'] = 'Database configuration is incomplete.';
            $response['step'] = 1;
            echo json_encode($response);
            exit;
        }

        if (empty($appUrl) || empty($appName)) {
            $response['message'] = 'Application configuration is incomplete.';
            $response['step'] = 1;
            echo json_encode($response);
            exit;
        }

        if (empty($adminUser) || empty($adminEmail) || empty($adminPass)) {
            $response['message'] = 'Admin account configuration is incomplete.';
            $response['step'] = 3;
            echo json_encode($response);
            exit;
        }

        // Generate APP_KEY
        $appKey = bin2hex(random_bytes(32));

        // ---- STEP 1: Create configuration file ----
        try {
            if (!is_dir(CONFIG_PATH)) {
                mkdir(CONFIG_PATH, 0755, true);
            }

            $configContent = "<?php\nreturn [\n";
            $configContent .= "    'db' => [\n";
            $configContent .= "        'host' => " . var_export($dbHost, true) . ",\n";
            $configContent .= "        'name' => " . var_export($dbName, true) . ",\n";
            $configContent .= "        'user' => " . var_export($dbUser, true) . ",\n";
            $configContent .= "        'pass' => " . var_export($dbPass, true) . ",\n";
            $configContent .= "        'charset' => 'utf8mb4',\n";
            $configContent .= "        'port' => {$dbPort},\n";
            $configContent .= "    ],\n";
            $configContent .= "    'app' => [\n";
            $configContent .= "        'name' => " . var_export($appName, true) . ",\n";
            $configContent .= "        'url' => " . var_export($appUrl, true) . ",\n";
            $configContent .= "        'key' => '{$appKey}',\n";
            $configContent .= "        'debug' => false,\n";
            $configContent .= "        'timezone' => " . var_export($timezone, true) . ",\n";
            $configContent .= "        'version' => '1.0.0',\n";
            $configContent .= "    ],\n";
            $configContent .= "    'session' => [\n";
            $configContent .= "        'lifetime' => 7200,\n";
            $configContent .= "        'name' => 'IGAMING_SESSION',\n";
            $configContent .= "    ],\n";
            $configContent .= "    'security' => [\n";
            $configContent .= "        'csrf_enabled' => true,\n";
            $configContent .= "        'rate_limit_per_minute' => 60,\n";
            $configContent .= "    ],\n";
            $configContent .= "    'currencies' => ['INR', 'USD', 'PKR', 'BDT'],\n";
            $configContent .= "    'default_currency' => " . var_export($defaultCurrency, true) . ",\n";
            $configContent .= "];\n";

            if (file_put_contents(CONFIG_FILE, $configContent) === false) {
                throw new Exception('Failed to write configuration file.');
            }
        } catch (Exception $e) {
            $response['message'] = 'Step 1 Failed: ' . $e->getMessage();
            $response['step'] = 1;
            // Clean up on failure
            if (file_exists(CONFIG_FILE)) {
                @unlink(CONFIG_FILE);
            }
            echo json_encode($response);
            exit;
        }

        // ---- STEP 2: Import database schema ----
        try {
            $dsn = "mysql:host={$dbHost};port={$dbPort};dbname={$dbName};charset=utf8mb4";
            $pdo = new PDO($dsn, $dbUser, $dbPass, [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            ]);

            if (!file_exists(SCHEMA_FILE)) {
                throw new Exception('Schema file not found at: ' . SCHEMA_FILE);
            }

            $schema = file_get_contents(SCHEMA_FILE);
            if ($schema === false) {
                throw new Exception('Could not read schema file.');
            }

            // Remove comments and split by semicolons
            $schema = preg_replace('/--.*$/m', '', $schema);
            $schema = preg_replace('/\/\*.*?\*\//s', '', $schema);

            $statements = array_filter(
                array_map('trim', preg_split('/;\s*$/m', $schema)),
                function ($s) {
                    return !empty($s);
                }
            );

            foreach ($statements as $statement) {
                if (!empty(trim($statement))) {
                    $pdo->exec($statement);
                }
            }
        } catch (Exception $e) {
            $response['message'] = 'Step 2 Failed (Database Schema): ' . $e->getMessage();
            $response['step'] = 2;
            @unlink(CONFIG_FILE);
            echo json_encode($response);
            exit;
        }

        // ---- STEP 3: Create admin account ----
        try {
            $passwordHash = password_hash($adminPass, PASSWORD_DEFAULT);
            $now = date('Y-m-d H:i:s');

            $stmt = $pdo->prepare("INSERT INTO admins (username, email, password, role, status, created_at) VALUES (?, ?, ?, 'super_admin', 'active', ?)");
            $stmt->execute([$adminUser, $adminEmail, $passwordHash, $now]);
        } catch (Exception $e) {
            $response['message'] = 'Step 3 Failed (Admin Account): ' . $e->getMessage();
            $response['step'] = 3;
            @unlink(CONFIG_FILE);
            echo json_encode($response);
            exit;
        }

        // ---- STEP 4: Encryption key already generated in config ----
        // (Already done in Step 1)

        // ---- STEP 5: Setup directories ----
        try {
            $dirs = [
                STORAGE_PATH,
                STORAGE_PATH . DIRECTORY_SEPARATOR . 'logs',
                STORAGE_PATH . DIRECTORY_SEPARATOR . 'cache',
                STORAGE_PATH . DIRECTORY_SEPARATOR . 'exports',
            ];

            foreach ($dirs as $dir) {
                if (!is_dir($dir)) {
                    if (!mkdir($dir, 0755, true)) {
                        throw new Exception("Failed to create directory: {$dir}");
                    }
                }
                // Create .gitkeep
                $gitkeep = $dir . DIRECTORY_SEPARATOR . '.gitkeep';
                if (!file_exists($gitkeep)) {
                    file_put_contents($gitkeep, '');
                }
            }
        } catch (Exception $e) {
            $response['message'] = 'Step 5 Failed (Directories): ' . $e->getMessage();
            $response['step'] = 5;
            echo json_encode($response);
            exit;
        }

        // ---- STEP 6: Insert default data ----
        try {
            // Insert default settings
            $settings = [
                ['app_name', $appName],
                ['app_url', $appUrl],
                ['default_currency', $defaultCurrency],
                ['timezone', $timezone],
                ['maintenance_mode', '0'],
                ['registration_enabled', '0'],
            ];

            // Check if settings table exists before inserting
            $tableCheck = $pdo->query("SHOW TABLES LIKE 'settings'");
            if ($tableCheck->rowCount() > 0) {
                $stmt = $pdo->prepare("INSERT INTO settings (setting_key, setting_value) VALUES (?, ?) ON DUPLICATE KEY UPDATE setting_value = VALUES(setting_value)");
                foreach ($settings as $setting) {
                    $stmt->execute($setting);
                }
            }

            // Insert default provider
            $tableCheck = $pdo->query("SHOW TABLES LIKE 'providers'");
            if ($tableCheck->rowCount() > 0) {
                $now = date('Y-m-d H:i:s');
                $stmt = $pdo->prepare("INSERT INTO providers (name, code, status, created_at) VALUES ('Default Provider', 'default', 'active', ?)");
                $stmt->execute([$now]);
            }
        } catch (Exception $e) {
            $response['message'] = 'Step 6 Failed (Default Data): ' . $e->getMessage();
            $response['step'] = 6;
            echo json_encode($response);
            exit;
        }

        // ---- STEP 7: Complete ----
        $adminUrl = $appUrl . '/admin';

        // Attempt to rename install.php
        $renamed = false;
        try {
            $renamed = @rename(__FILE__, __DIR__ . DIRECTORY_SEPARATOR . 'install.php.bak');
        } catch (Exception $e) {
            // Non-fatal
        }

        $response['success'] = true;
        $response['message'] = 'Installation completed successfully!';
        $response['admin_url'] = $adminUrl;
        $response['renamed'] = $renamed;
        echo json_encode($response);
        exit;
    }

    // Unknown action
    echo json_encode(['success' => false, 'message' => 'Unknown action.']);
    exit;
}

// ============================================================
// AJAX HANDLER: Fix Permissions
// ============================================================
if (isset($_POST['action_fix_permissions'])) {
    header('Content-Type: application/json');

    if ($alreadyInstalled) {
        echo json_encode(['success' => false, 'message' => 'System is already installed.']);
        exit;
    }

    $dirs = [
        CONFIG_PATH,
        STORAGE_PATH,
        STORAGE_PATH . DIRECTORY_SEPARATOR . 'logs',
        STORAGE_PATH . DIRECTORY_SEPARATOR . 'cache',
        STORAGE_PATH . DIRECTORY_SEPARATOR . 'exports',
    ];

    $results = [];
    $allFixed = true;

    foreach ($dirs as $dir) {
        $relative = str_replace(BASE_PATH . DIRECTORY_SEPARATOR, '', $dir) . '/';
        if (!is_dir($dir)) {
            $created = @mkdir($dir, 0755, true);
            if (!$created) {
                $results[] = ['path' => $relative, 'fixed' => false];
                $allFixed = false;
                continue;
            }
        }
        $chmoded = @chmod($dir, 0755);
        $writable = is_writable($dir);
        $results[] = ['path' => $relative, 'fixed' => $writable];
        if (!$writable) {
            $allFixed = false;
        }
    }

    echo json_encode(['success' => $allFixed, 'results' => $results]);
    exit;
}

// ============================================================
// SERVER REQUIREMENTS DATA (for rendering)
// ============================================================
$requirements = [];

// PHP Version
$phpVersion = PHP_VERSION;
$phpOk = version_compare($phpVersion, '8.0.0', '>=');
$requirements[] = [
    'name' => 'PHP Version',
    'required' => '>= 8.0',
    'current' => $phpVersion,
    'passed' => $phpOk,
    'critical' => true,
];

// PDO MySQL
$pdoMysql = extension_loaded('pdo_mysql');
$requirements[] = [
    'name' => 'PDO MySQL Extension',
    'required' => 'Enabled',
    'current' => $pdoMysql ? 'Enabled' : 'Disabled',
    'passed' => $pdoMysql,
    'critical' => true,
];

// OpenSSL
$openssl = extension_loaded('openssl');
$requirements[] = [
    'name' => 'OpenSSL Extension',
    'required' => 'Enabled',
    'current' => $openssl ? 'Enabled' : 'Disabled',
    'passed' => $openssl,
    'critical' => true,
];

// Mbstring
$mbstring = extension_loaded('mbstring');
$requirements[] = [
    'name' => 'Mbstring Extension',
    'required' => 'Enabled',
    'current' => $mbstring ? 'Enabled' : 'Disabled',
    'passed' => $mbstring,
    'critical' => true,
];

// JSON
$json = extension_loaded('json');
$requirements[] = [
    'name' => 'JSON Extension',
    'required' => 'Enabled',
    'current' => $json ? 'Enabled' : 'Disabled',
    'passed' => $json,
    'critical' => true,
];

// cURL
$curl = extension_loaded('curl');
$requirements[] = [
    'name' => 'cURL Extension',
    'required' => 'Enabled',
    'current' => $curl ? 'Enabled' : 'Disabled',
    'passed' => $curl,
    'critical' => true,
];

// mod_rewrite
$modRewrite = false;
if (function_exists('apache_get_modules')) {
    $modRewrite = in_array('mod_rewrite', apache_get_modules());
} elseif (isset($_SERVER['HTTP_MOD_REWRITE']) && strtolower($_SERVER['HTTP_MOD_REWRITE']) === 'on') {
    $modRewrite = true;
} elseif (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) {
    $modRewrite = true;
} elseif (strpos($_SERVER['SERVER_SOFTWARE'] ?? '', 'Apache') !== false) {
    // If running on Apache, assume mod_rewrite might be available
    if (file_exists(BASE_PATH . DIRECTORY_SEPARATOR . '.htaccess')) {
        $modRewrite = true; // .htaccess exists, likely enabled
    }
}
$requirements[] = [
    'name' => 'mod_rewrite',
    'required' => 'Enabled',
    'current' => $modRewrite ? 'Likely Enabled' : 'Unknown',
    'passed' => $modRewrite,
    'critical' => false, // warning only
];

$allCriticalPassed = true;
foreach ($requirements as $req) {
    if ($req['critical'] && !$req['passed']) {
        $allCriticalPassed = false;
        break;
    }
}

// Folder permissions data
$folders = [
    'config/',
    'storage/',
    'storage/logs/',
    'storage/cache/',
    'storage/exports/',
];

$folderChecks = [];
foreach ($folders as $folder) {
    $fullPath = BASE_PATH . DIRECTORY_SEPARATOR . str_replace('/', DIRECTORY_SEPARATOR, rtrim($folder, '/'));
    $exists = is_dir($fullPath);
    $writable = $exists && is_writable($fullPath);
    $folderChecks[] = [
        'path' => $folder,
        'exists' => $exists,
        'writable' => $writable,
    ];
}

$allFoldersOk = true;
foreach ($folderChecks as $fc) {
    if (!$fc['writable']) {
        $allFoldersOk = false;
        break;
    }
}

// Auto-detect app URL
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'] ?? 'localhost';
$scriptDir = dirname($_SERVER['SCRIPT_NAME']);
$detectedUrl = $protocol . '://' . $host . ($scriptDir !== '/' ? $scriptDir : '');

// Encode data for JavaScript
$requirementsJson = json_encode($requirements);
$folderChecksJson = json_encode($folderChecks);
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="robots" content="noindex, nofollow">
    <title>iGamingApi - Installation Wizard</title>
    <style>
        /* ============================================================
           CSS RESET & BASE
           ============================================================ */
        *, *::before, *::after {
            box-sizing: border-box;
            margin: 0;
            padding: 0;
        }

        :root {
            --bg-primary: #0a0a0a;
            --bg-secondary: #141414;
            --bg-tertiary: #1e1e1e;
            --gold-primary: #d4af37;
            --gold-light: #f4e5a3;
            --gold-dark: #b8961f;
            --text-primary: #ffffff;
            --text-secondary: #a0a0a0;
            --danger: #ff4757;
            --success: #2ed573;
            --warning: #ffa502;
            --info: #3498db;
            --glass-bg: rgba(255, 255, 255, 0.03);
            --glass-border: rgba(212, 175, 55, 0.15);
            --glass-border-hover: rgba(212, 175, 55, 0.35);
            --gold-gradient: linear-gradient(135deg, #d4af37 0%, #f4e5a3 50%, #d4af37 100%);
            --gold-gradient-btn: linear-gradient(135deg, #d4af37 0%, #e8c84a 50%, #d4af37 100%);
            --card-shadow: 0 25px 60px rgba(0, 0, 0, 0.5), 0 0 40px rgba(212, 175, 55, 0.04);
            --transition-fast: 0.2s ease;
            --transition-normal: 0.3s ease;
            --transition-slow: 0.5s ease;
        }

        html {
            font-size: 16px;
            -webkit-font-smoothing: antialiased;
            -moz-osx-font-smoothing: grayscale;
        }

        body {
            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
            background: var(--bg-primary);
            color: var(--text-primary);
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            padding: 20px;
            position: relative;
            overflow-x: hidden;
        }

        /* Background decorative elements */
        body::before {
            content: '';
            position: fixed;
            top: -50%;
            left: -50%;
            width: 200%;
            height: 200%;
            background: radial-gradient(ellipse at 20% 20%, rgba(212, 175, 55, 0.03) 0%, transparent 50%),
                        radial-gradient(ellipse at 80% 80%, rgba(212, 175, 55, 0.02) 0%, transparent 50%);
            pointer-events: none;
            z-index: 0;
        }

        /* ============================================================
           INSTALLER CONTAINER
           ============================================================ */
        .installer-container {
            width: 100%;
            max-width: 700px;
            position: relative;
            z-index: 1;
        }

        .installer-card {
            background: var(--glass-bg);
            border: 1px solid var(--glass-border);
            border-radius: 20px;
            box-shadow: var(--card-shadow);
            overflow: hidden;
            position: relative;
            backdrop-filter: blur(10px);
            -webkit-backdrop-filter: blur(10px);
        }

        /* Shimmer border effect */
        .installer-card::before {
            content: '';
            position: absolute;
            top: -1px;
            left: -1px;
            right: -1px;
            bottom: -1px;
            border-radius: 21px;
            background: linear-gradient(
                45deg,
                transparent 0%,
                rgba(212, 175, 55, 0.1) 25%,
                rgba(244, 229, 163, 0.15) 50%,
                rgba(212, 175, 55, 0.1) 75%,
                transparent 100%
            );
            background-size: 400% 400%;
            animation: shimmerBorder 8s ease infinite;
            z-index: -1;
            pointer-events: none;
        }

        @keyframes shimmerBorder {
            0%, 100% { background-position: 0% 50%; }
            50% { background-position: 100% 50%; }
        }

        .installer-card-inner {
            padding: 40px;
        }

        @media (max-width: 600px) {
            .installer-card-inner {
                padding: 24px 20px;
            }
        }

        /* ============================================================
           STEP INDICATOR
           ============================================================ */
        .step-indicator {
            display: flex;
            align-items: center;
            justify-content: center;
            padding: 24px 40px 0;
            gap: 0;
        }

        .step-dot-wrapper {
            display: flex;
            align-items: center;
        }

        .step-dot {
            width: 12px;
            height: 12px;
            border-radius: 50%;
            background: var(--bg-tertiary);
            border: 2px solid rgba(255, 255, 255, 0.1);
            transition: all var(--transition-normal);
            position: relative;
            cursor: default;
            flex-shrink: 0;
        }

        .step-dot.active {
            background: var(--gold-primary);
            border-color: var(--gold-primary);
            box-shadow: 0 0 12px rgba(212, 175, 55, 0.5);
            transform: scale(1.2);
        }

        .step-dot.completed {
            background: var(--success);
            border-color: var(--success);
            box-shadow: 0 0 8px rgba(46, 213, 115, 0.3);
        }

        .step-line {
            width: 24px;
            height: 2px;
            background: rgba(255, 255, 255, 0.08);
            transition: background var(--transition-normal);
            flex-shrink: 0;
        }

        .step-line.completed {
            background: var(--success);
        }

        @media (max-width: 480px) {
            .step-dot {
                width: 10px;
                height: 10px;
            }
            .step-line {
                width: 14px;
            }
            .step-indicator {
                padding: 20px 20px 0;
            }
        }

        /* ============================================================
           ALREADY INSTALLED BLOCK
           ============================================================ */
        .already-installed {
            text-align: center;
            padding: 60px 40px;
        }

        .already-installed .lock-icon {
            font-size: 64px;
            margin-bottom: 20px;
            display: block;
        }

        .already-installed h2 {
            color: var(--danger);
            font-size: 1.5rem;
            margin-bottom: 12px;
        }

        .already-installed p {
            color: var(--text-secondary);
            line-height: 1.6;
        }

        /* ============================================================
           STEP PANELS
           ============================================================ */
        .step-panel {
            display: none;
            opacity: 0;
            transform: translateY(10px);
            transition: opacity var(--transition-normal), transform var(--transition-normal);
        }

        .step-panel.active {
            display: block;
            opacity: 1;
            transform: translateY(0);
        }

        /* ============================================================
           TYPOGRAPHY
           ============================================================ */
        .step-title {
            font-size: 1.5rem;
            font-weight: 700;
            color: var(--text-primary);
            margin-bottom: 8px;
        }

        .step-subtitle {
            font-size: 0.9rem;
            color: var(--text-secondary);
            margin-bottom: 28px;
            line-height: 1.5;
        }

        /* ============================================================
           WELCOME STEP
           ============================================================ */
        .welcome-content {
            text-align: center;
        }

        .brand-icon {
            font-size: 56px;
            margin-bottom: 8px;
            display: block;
            filter: drop-shadow(0 0 20px rgba(212, 175, 55, 0.3));
            animation: floatIcon 3s ease-in-out infinite;
        }

        @keyframes floatIcon {
            0%, 100% { transform: translateY(0); }
            50% { transform: translateY(-6px); }
        }

        .brand-name {
            font-size: 2rem;
            font-weight: 800;
            background: var(--gold-gradient);
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
            background-clip: text;
            margin-bottom: 6px;
        }

        .brand-tagline {
            color: var(--text-secondary);
            font-size: 0.85rem;
            letter-spacing: 1.5px;
            text-transform: uppercase;
            margin-bottom: 24px;
        }

        .welcome-description {
            color: var(--text-secondary);
            line-height: 1.7;
            margin-bottom: 32px;
            max-width: 500px;
            margin-left: auto;
            margin-right: auto;
            font-size: 0.95rem;
        }

        .feature-grid {
            display: grid;
            grid-template-columns: 1fr 1fr;
            gap: 12px;
            margin-bottom: 32px;
            text-align: left;
        }

        @media (max-width: 480px) {
            .feature-grid {
                grid-template-columns: 1fr;
            }
        }

        .feature-item {
            display: flex;
            align-items: center;
            gap: 10px;
            padding: 12px 16px;
            background: var(--bg-secondary);
            border-radius: 10px;
            border: 1px solid rgba(255, 255, 255, 0.04);
            font-size: 0.85rem;
            color: var(--text-secondary);
        }

        .feature-item span.fi-icon {
            color: var(--gold-primary);
            font-size: 1.1rem;
            flex-shrink: 0;
        }

        /* ============================================================
           BUTTONS
           ============================================================ */
        .btn {
            display: inline-flex;
            align-items: center;
            justify-content: center;
            gap: 8px;
            padding: 14px 32px;
            border: none;
            border-radius: 12px;
            font-size: 0.95rem;
            font-weight: 600;
            cursor: pointer;
            transition: all var(--transition-normal);
            font-family: inherit;
            outline: none;
            text-decoration: none;
            position: relative;
            overflow: hidden;
        }

        .btn-gold {
            background: var(--gold-gradient-btn);
            color: #0a0a0a;
            box-shadow: 0 4px 15px rgba(212, 175, 55, 0.3);
        }

        .btn-gold:hover:not(:disabled) {
            box-shadow: 0 6px 25px rgba(212, 175, 55, 0.45);
            transform: translateY(-1px);
        }

        .btn-gold:active:not(:disabled) {
            transform: translateY(0);
        }

        .btn-gold:disabled {
            opacity: 0.4;
            cursor: not-allowed;
            transform: none;
        }

        .btn-outline {
            background: transparent;
            color: var(--text-secondary);
            border: 1px solid rgba(255, 255, 255, 0.12);
        }

        .btn-outline:hover:not(:disabled) {
            border-color: rgba(255, 255, 255, 0.25);
            color: var(--text-primary);
            background: rgba(255, 255, 255, 0.03);
        }

        .btn-secondary {
            background: var(--bg-tertiary);
            color: var(--text-primary);
            border: 1px solid rgba(255, 255, 255, 0.08);
        }

        .btn-secondary:hover:not(:disabled) {
            background: rgba(255, 255, 255, 0.08);
            border-color: rgba(255, 255, 255, 0.15);
        }

        .btn-sm {
            padding: 10px 20px;
            font-size: 0.85rem;
            border-radius: 10px;
        }

        .btn-block {
            width: 100%;
        }

        .btn-group {
            display: flex;
            gap: 12px;
            margin-top: 28px;
        }

        .btn-group .btn {
            flex: 1;
        }

        @media (max-width: 480px) {
            .btn-group {
                flex-direction: column;
            }
        }

        /* ============================================================
           REQUIREMENT CHECK ROWS
           ============================================================ */
        .check-list {
            margin-bottom: 20px;
        }

        .check-item {
            display: flex;
            align-items: center;
            justify-content: space-between;
            padding: 14px 16px;
            background: var(--bg-secondary);
            border-radius: 10px;
            margin-bottom: 8px;
            border: 1px solid rgba(255, 255, 255, 0.04);
            transition: border-color var(--transition-fast);
        }

        .check-item:hover {
            border-color: rgba(255, 255, 255, 0.08);
        }

        .check-item-info {
            display: flex;
            flex-direction: column;
            gap: 2px;
        }

        .check-item-name {
            font-size: 0.9rem;
            font-weight: 500;
            color: var(--text-primary);
        }

        .check-item-detail {
            font-size: 0.75rem;
            color: var(--text-secondary);
        }

        .check-item-status {
            font-size: 1.2rem;
            flex-shrink: 0;
            width: 28px;
            height: 28px;
            display: flex;
            align-items: center;
            justify-content: center;
            border-radius: 50%;
        }

        .check-item-status.pass {
            color: var(--success);
            background: rgba(46, 213, 115, 0.1);
        }

        .check-item-status.fail {
            color: var(--danger);
            background: rgba(255, 71, 87, 0.1);
        }

        .check-item-status.warn {
            color: var(--warning);
            background: rgba(255, 165, 2, 0.1);
        }

        /* ============================================================
           FORM ELEMENTS
           ============================================================ */
        .form-group {
            margin-bottom: 18px;
        }

        .form-label {
            display: block;
            font-size: 0.85rem;
            font-weight: 500;
            color: var(--text-secondary);
            margin-bottom: 6px;
        }

        .form-label .required {
            color: var(--danger);
            margin-left: 2px;
        }

        .form-input {
            width: 100%;
            padding: 12px 16px;
            background: var(--bg-tertiary);
            border: 1px solid rgba(255, 255, 255, 0.08);
            border-radius: 10px;
            color: var(--text-primary);
            font-size: 0.9rem;
            font-family: inherit;
            transition: all var(--transition-fast);
            outline: none;
        }

        .form-input:focus {
            border-color: var(--gold-primary);
            box-shadow: 0 0 0 3px rgba(212, 175, 55, 0.1);
        }

        .form-input::placeholder {
            color: rgba(255, 255, 255, 0.2);
        }

        .form-input.error {
            border-color: var(--danger);
            box-shadow: 0 0 0 3px rgba(255, 71, 87, 0.1);
        }

        .form-input.success {
            border-color: var(--success);
            box-shadow: 0 0 0 3px rgba(46, 213, 115, 0.1);
        }

        .form-row {
            display: grid;
            grid-template-columns: 1fr 1fr;
            gap: 16px;
        }

        @media (max-width: 480px) {
            .form-row {
                grid-template-columns: 1fr;
            }
        }

        .form-help {
            font-size: 0.75rem;
            color: var(--text-secondary);
            margin-top: 4px;
        }

        .form-error {
            font-size: 0.75rem;
            color: var(--danger);
            margin-top: 4px;
            display: none;
        }

        .form-error.show {
            display: block;
        }

        select.form-input {
            appearance: none;
            -webkit-appearance: none;
            background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23a0a0a0' d='M6 8L1 3h10z'/%3E%3C/svg%3E");
            background-repeat: no-repeat;
            background-position: right 14px center;
            padding-right: 36px;
        }

        select.form-input option {
            background: var(--bg-tertiary);
            color: var(--text-primary);
        }

        /* Checkbox */
        .form-checkbox-wrapper {
            display: flex;
            align-items: center;
            gap: 10px;
            padding: 12px 16px;
            background: var(--bg-secondary);
            border-radius: 10px;
            border: 1px solid rgba(255, 255, 255, 0.04);
            cursor: pointer;
            transition: border-color var(--transition-fast);
        }

        .form-checkbox-wrapper:hover {
            border-color: rgba(255, 255, 255, 0.1);
        }

        .form-checkbox {
            appearance: none;
            -webkit-appearance: none;
            width: 20px;
            height: 20px;
            border: 2px solid rgba(255, 255, 255, 0.15);
            border-radius: 6px;
            background: var(--bg-tertiary);
            cursor: pointer;
            transition: all var(--transition-fast);
            position: relative;
            flex-shrink: 0;
        }

        .form-checkbox:checked {
            background: var(--gold-primary);
            border-color: var(--gold-primary);
        }

        .form-checkbox:checked::after {
            content: '✓';
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            color: #0a0a0a;
            font-size: 12px;
            font-weight: 700;
        }

        .form-checkbox-label {
            font-size: 0.85rem;
            color: var(--text-secondary);
            cursor: pointer;
        }

        /* ============================================================
           PASSWORD STRENGTH METER
           ============================================================ */
        .password-strength {
            margin-top: 8px;
        }

        .password-strength-bar {
            width: 100%;
            height: 4px;
            background: var(--bg-secondary);
            border-radius: 4px;
            overflow: hidden;
            margin-bottom: 4px;
        }

        .password-strength-fill {
            height: 100%;
            width: 0%;
            border-radius: 4px;
            transition: all var(--transition-normal);
        }

        .password-strength-text {
            font-size: 0.72rem;
            color: var(--text-secondary);
            text-align: right;
        }

        /* ============================================================
           ALERT / MESSAGE BOXES
           ============================================================ */
        .alert {
            padding: 14px 18px;
            border-radius: 10px;
            font-size: 0.85rem;
            line-height: 1.5;
            margin-bottom: 16px;
            display: flex;
            align-items: flex-start;
            gap: 10px;
        }

        .alert-icon {
            font-size: 1.1rem;
            flex-shrink: 0;
            margin-top: 1px;
        }

        .alert-success {
            background: rgba(46, 213, 115, 0.08);
            border: 1px solid rgba(46, 213, 115, 0.2);
            color: var(--success);
        }

        .alert-danger {
            background: rgba(255, 71, 87, 0.08);
            border: 1px solid rgba(255, 71, 87, 0.2);
            color: var(--danger);
        }

        .alert-warning {
            background: rgba(255, 165, 2, 0.08);
            border: 1px solid rgba(255, 165, 2, 0.2);
            color: var(--warning);
        }

        .alert-info {
            background: rgba(52, 152, 219, 0.08);
            border: 1px solid rgba(52, 152, 219, 0.2);
            color: var(--info);
        }

        .db-test-result {
            display: none;
            margin-top: 12px;
        }

        /* ============================================================
           INSTALLATION PROGRESS
           ============================================================ */
        .progress-container {
            margin-bottom: 24px;
        }

        .progress-bar-wrapper {
            width: 100%;
            height: 6px;
            background: var(--bg-secondary);
            border-radius: 6px;
            overflow: hidden;
            margin-bottom: 24px;
        }

        .progress-bar-fill {
            height: 100%;
            width: 0%;
            background: var(--gold-gradient-btn);
            border-radius: 6px;
            transition: width 0.6s ease;
        }

        .install-step-list {
            list-style: none;
        }

        .install-step-item {
            display: flex;
            align-items: center;
            gap: 12px;
            padding: 12px 16px;
            background: var(--bg-secondary);
            border-radius: 10px;
            margin-bottom: 8px;
            border: 1px solid rgba(255, 255, 255, 0.04);
            opacity: 0.3;
            transform: translateX(-10px);
            transition: all var(--transition-normal);
        }

        .install-step-item.processing {
            opacity: 1;
            transform: translateX(0);
            border-color: rgba(212, 175, 55, 0.2);
        }

        .install-step-item.completed {
            opacity: 1;
            transform: translateX(0);
            border-color: rgba(46, 213, 115, 0.15);
        }

        .install-step-item.failed {
            opacity: 1;
            transform: translateX(0);
            border-color: rgba(255, 71, 87, 0.15);
        }

        .install-step-icon {
            width: 24px;
            height: 24px;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 0.75rem;
            flex-shrink: 0;
            background: var(--bg-tertiary);
            color: var(--text-secondary);
        }

        .install-step-item.processing .install-step-icon {
            background: rgba(212, 175, 55, 0.15);
            color: var(--gold-primary);
        }

        .install-step-item.completed .install-step-icon {
            background: rgba(46, 213, 115, 0.15);
            color: var(--success);
        }

        .install-step-item.failed .install-step-icon {
            background: rgba(255, 71, 87, 0.15);
            color: var(--danger);
        }

        .install-step-text {
            font-size: 0.85rem;
            color: var(--text-secondary);
        }

        .install-step-item.processing .install-step-text {
            color: var(--text-primary);
        }

        .install-step-item.completed .install-step-text {
            color: var(--success);
        }

        .install-step-item.failed .install-step-text {
            color: var(--danger);
        }

        /* Spinner */
        .spinner {
            display: inline-block;
            width: 14px;
            height: 14px;
            border: 2px solid rgba(212, 175, 55, 0.2);
            border-top-color: var(--gold-primary);
            border-radius: 50%;
            animation: spin 0.8s linear infinite;
        }

        @keyframes spin {
            to { transform: rotate(360deg); }
        }

        .spinner-sm {
            width: 16px;
            height: 16px;
            border-width: 2px;
        }

        .spinner-btn {
            width: 16px;
            height: 16px;
            border: 2px solid rgba(10, 10, 10, 0.2);
            border-top-color: #0a0a0a;
            border-radius: 50%;
            animation: spin 0.8s linear infinite;
            display: none;
        }

        /* ============================================================
           COMPLETION STEP
           ============================================================ */
        .completion-content {
            text-align: center;
        }

        .success-checkmark {
            width: 80px;
            height: 80px;
            margin: 0 auto 24px;
            background: rgba(46, 213, 115, 0.1);
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 40px;
            color: var(--success);
            animation: scaleIn 0.5s ease;
            border: 2px solid rgba(46, 213, 115, 0.2);
        }

        @keyframes scaleIn {
            0% {
                transform: scale(0);
                opacity: 0;
            }
            70% {
                transform: scale(1.1);
            }
            100% {
                transform: scale(1);
                opacity: 1;
            }
        }

        .completion-title {
            font-size: 1.75rem;
            font-weight: 700;
            color: var(--success);
            margin-bottom: 12px;
        }

        .completion-info {
            margin-top: 20px;
            padding: 16px;
            background: var(--bg-secondary);
            border-radius: 12px;
            border: 1px solid rgba(255, 255, 255, 0.04);
        }

        .completion-info-row {
            display: flex;
            justify-content: space-between;
            align-items: center;
            padding: 8px 0;
            font-size: 0.85rem;
        }

        .completion-info-row:not(:last-child) {
            border-bottom: 1px solid rgba(255, 255, 255, 0.04);
        }

        .completion-info-label {
            color: var(--text-secondary);
        }

        .completion-info-value {
            color: var(--gold-primary);
            font-weight: 500;
        }

        .completion-info-value a {
            color: var(--gold-primary);
            text-decoration: none;
        }

        .completion-info-value a:hover {
            text-decoration: underline;
        }

        .completion-warning {
            margin-top: 20px;
        }

        /* ============================================================
           UTILITY CLASSES
           ============================================================ */
        .text-center { text-align: center; }
        .text-gold { color: var(--gold-primary); }
        .text-success { color: var(--success); }
        .text-danger { color: var(--danger); }
        .text-secondary { color: var(--text-secondary); }
        .mt-16 { margin-top: 16px; }
        .mt-24 { margin-top: 24px; }
        .mb-16 { margin-bottom: 16px; }
        .mb-24 { margin-bottom: 24px; }
        .hidden { display: none !important; }

        /* ============================================================
           ANIMATIONS
           ============================================================ */
        @keyframes fadeInUp {
            from {
                opacity: 0;
                transform: translateY(15px);
            }
            to {
                opacity: 1;
                transform: translateY(0);
            }
        }

        .fade-in-up {
            animation: fadeInUp 0.4s ease forwards;
        }

        @keyframes pulse {
            0%, 100% { opacity: 1; }
            50% { opacity: 0.5; }
        }

        .pulse {
            animation: pulse 1.5s ease-in-out infinite;
        }

        /* ============================================================
           SCROLLBAR
           ============================================================ */
        ::-webkit-scrollbar {
            width: 6px;
        }
        ::-webkit-scrollbar-track {
            background: var(--bg-primary);
        }
        ::-webkit-scrollbar-thumb {
            background: rgba(255, 255, 255, 0.1);
            border-radius: 6px;
        }
        ::-webkit-scrollbar-thumb:hover {
            background: rgba(255, 255, 255, 0.2);
        }
    </style>
</head>
<body>

<div class="installer-container">
<?php if ($alreadyInstalled): ?>
    <!-- ALREADY INSTALLED BLOCK -->
    <div class="installer-card">
        <div class="already-installed">
            <span class="lock-icon">🔒</span>
            <h2>Already Installed</h2>
            <p>iGamingApi has already been configured on this server.<br>
            The configuration file <strong>config/config.php</strong> already exists.</p>
            <p class="mt-16" style="font-size: 0.8rem;">
                To reinstall, delete <code style="background:var(--bg-tertiary);padding:2px 8px;border-radius:4px;">config/config.php</code> and reload this page.
            </p>
        </div>
    </div>
<?php else: ?>
    <div class="installer-card">
        <!-- Step Indicator -->
        <div class="step-indicator" id="stepIndicator">
            <div class="step-dot-wrapper">
                <div class="step-dot active" data-step="1"></div>
            </div>
            <div class="step-line" data-after="1"></div>
            <div class="step-dot-wrapper">
                <div class="step-dot" data-step="2"></div>
            </div>
            <div class="step-line" data-after="2"></div>
            <div class="step-dot-wrapper">
                <div class="step-dot" data-step="3"></div>
            </div>
            <div class="step-line" data-after="3"></div>
            <div class="step-dot-wrapper">
                <div class="step-dot" data-step="4"></div>
            </div>
            <div class="step-line" data-after="4"></div>
            <div class="step-dot-wrapper">
                <div class="step-dot" data-step="5"></div>
            </div>
            <div class="step-line" data-after="5"></div>
            <div class="step-dot-wrapper">
                <div class="step-dot" data-step="6"></div>
            </div>
            <div class="step-line" data-after="6"></div>
            <div class="step-dot-wrapper">
                <div class="step-dot" data-step="7"></div>
            </div>
            <div class="step-line" data-after="7"></div>
            <div class="step-dot-wrapper">
                <div class="step-dot" data-step="8"></div>
            </div>
        </div>

        <div class="installer-card-inner">

            <!-- ==============================
                 STEP 1: Welcome
                 ============================== -->
            <div class="step-panel active" id="step1">
                <div class="welcome-content">
                    <span class="brand-icon">♛</span>
                    <div class="brand-name">iGamingApi</div>
                    <div class="brand-tagline">Enterprise iGaming GGR Client Management System</div>
                    <p class="welcome-description">
                        Welcome to the installation wizard. This process will guide you through 
                        setting up your iGamingApi platform, including server verification, 
                        database configuration, and admin account creation.
                    </p>
                    <div class="feature-grid">
                        <div class="feature-item">
                            <span class="fi-icon">◆</span>
                            <span>Client Management</span>
                        </div>
                        <div class="feature-item">
                            <span class="fi-icon">◆</span>
                            <span>GGR Settlements</span>
                        </div>
                        <div class="feature-item">
                            <span class="fi-icon">◆</span>
                            <span>API Proxy Engine</span>
                        </div>
                        <div class="feature-item">
                            <span class="fi-icon">◆</span>
                            <span>Secure Dashboard</span>
                        </div>
                    </div>
                    <button class="btn btn-gold btn-block" onclick="goToStep(2)">
                        Begin Installation →
                    </button>
                </div>
            </div>

            <!-- ==============================
                 STEP 2: Server Requirements
                 ============================== -->
            <div class="step-panel" id="step2">
                <h3 class="step-title">Server Requirements</h3>
                <p class="step-subtitle">Checking if your server meets the minimum requirements to run iGamingApi.</p>

                <div class="check-list" id="requirementsList">
                    <!-- Rendered by JS -->
                </div>

                <div class="btn-group">
                    <button class="btn btn-outline" onclick="goToStep(1)">← Back</button>
                    <button class="btn btn-secondary btn-sm" onclick="recheckRequirements()">⟳ Check Again</button>
                    <button class="btn btn-gold" id="btnReqContinue" onclick="goToStep(3)" disabled>Continue →</button>
                </div>
            </div>

            <!-- ==============================
                 STEP 3: Folder Permissions
                 ============================== -->
            <div class="step-panel" id="step3">
                <h3 class="step-title">Folder Permissions</h3>
                <p class="step-subtitle">These directories must be writable for the application to function correctly.</p>

                <div class="check-list" id="foldersList">
                    <!-- Rendered by JS -->
                </div>

                <div class="btn-group">
                    <button class="btn btn-outline" onclick="goToStep(2)">← Back</button>
                    <button class="btn btn-secondary btn-sm" id="btnFixPerms" onclick="fixPermissions()">🔧 Fix Permissions</button>
                    <button class="btn btn-gold" id="btnFolderContinue" onclick="goToStep(4)" disabled>Continue →</button>
                </div>
            </div>

            <!-- ==============================
                 STEP 4: Database Configuration
                 ============================== -->
            <div class="step-panel" id="step4">
                <h3 class="step-title">Database Configuration</h3>
                <p class="step-subtitle">Enter your MySQL database connection details.</p>

                <div class="form-row">
                    <div class="form-group">
                        <label class="form-label">Database Host <span class="required">*</span></label>
                        <input type="text" class="form-input" id="dbHost" value="localhost" placeholder="localhost">
                    </div>
                    <div class="form-group">
                        <label class="form-label">Database Port</label>
                        <input type="number" class="form-input" id="dbPort" value="3306" placeholder="3306">
                    </div>
                </div>

                <div class="form-group">
                    <label class="form-label">Database Name <span class="required">*</span></label>
                    <input type="text" class="form-input" id="dbName" placeholder="igaming_db">
                </div>

                <div class="form-row">
                    <div class="form-group">
                        <label class="form-label">Username <span class="required">*</span></label>
                        <input type="text" class="form-input" id="dbUser" placeholder="root">
                    </div>
                    <div class="form-group">
                        <label class="form-label">Password</label>
                        <input type="password" class="form-input" id="dbPass" placeholder="••••••••">
                    </div>
                </div>

                <div class="form-group">
                    <label class="form-checkbox-wrapper">
                        <input type="checkbox" class="form-checkbox" id="dbCreate">
                        <span class="form-checkbox-label">Create database if it does not exist</span>
                    </label>
                </div>

                <div class="db-test-result" id="dbTestResult"></div>

                <div class="btn-group">
                    <button class="btn btn-outline" onclick="goToStep(3)">← Back</button>
                    <button class="btn btn-secondary" id="btnTestDb" onclick="testDatabase()">
                        <span class="spinner-btn" id="dbTestSpinner"></span>
                        <span id="dbTestBtnText">⚡ Test Connection</span>
                    </button>
                    <button class="btn btn-gold" id="btnDbContinue" onclick="goToStep(5)" disabled>Continue →</button>
                </div>
            </div>

            <!-- ==============================
                 STEP 5: Application Setup
                 ============================== -->
            <div class="step-panel" id="step5">
                <h3 class="step-title">Application Setup</h3>
                <p class="step-subtitle">Configure your application settings.</p>

                <div class="form-group">
                    <label class="form-label">Application URL <span class="required">*</span></label>
                    <input type="text" class="form-input" id="appUrl" value="<?php echo htmlspecialchars($detectedUrl); ?>" placeholder="https://yourdomain.com">
                    <p class="form-help">Auto-detected from your server. Adjust if needed (no trailing slash).</p>
                </div>

                <div class="form-group">
                    <label class="form-label">Application Name <span class="required">*</span></label>
                    <input type="text" class="form-input" id="appName" value="iGamingApi" placeholder="iGamingApi">
                </div>

                <div class="form-row">
                    <div class="form-group">
                        <label class="form-label">Default Currency</label>
                        <select class="form-input" id="appCurrency">
                            <option value="INR" selected>INR - Indian Rupee</option>
                            <option value="USD">USD - US Dollar</option>
                            <option value="PKR">PKR - Pakistani Rupee</option>
                            <option value="BDT">BDT - Bangladeshi Taka</option>
                        </select>
                    </div>
                    <div class="form-group">
                        <label class="form-label">Timezone</label>
                        <select class="form-input" id="appTimezone">
                            <option value="Asia/Kolkata" selected>Asia/Kolkata (IST)</option>
                            <option value="Asia/Karachi">Asia/Karachi (PKT)</option>
                            <option value="Asia/Dhaka">Asia/Dhaka (BST)</option>
                            <option value="Asia/Dubai">Asia/Dubai (GST)</option>
                            <option value="Asia/Singapore">Asia/Singapore (SGT)</option>
                            <option value="Asia/Hong_Kong">Asia/Hong_Kong (HKT)</option>
                            <option value="Asia/Tokyo">Asia/Tokyo (JST)</option>
                            <option value="Asia/Shanghai">Asia/Shanghai (CST)</option>
                            <option value="Europe/London">Europe/London (GMT/BST)</option>
                            <option value="Europe/Paris">Europe/Paris (CET)</option>
                            <option value="Europe/Berlin">Europe/Berlin (CET)</option>
                            <option value="America/New_York">America/New_York (EST)</option>
                            <option value="America/Chicago">America/Chicago (CST)</option>
                            <option value="America/Denver">America/Denver (MST)</option>
                            <option value="America/Los_Angeles">America/Los_Angeles (PST)</option>
                            <option value="Pacific/Auckland">Pacific/Auckland (NZST)</option>
                            <option value="Australia/Sydney">Australia/Sydney (AEST)</option>
                            <option value="UTC">UTC</option>
                        </select>
                    </div>
                </div>

                <div class="btn-group">
                    <button class="btn btn-outline" onclick="goToStep(4)">← Back</button>
                    <button class="btn btn-gold" onclick="validateStep5()">Continue →</button>
                </div>
            </div>

            <!-- ==============================
                 STEP 6: Create Super Admin
                 ============================== -->
            <div class="step-panel" id="step6">
                <h3 class="step-title">Create Super Admin</h3>
                <p class="step-subtitle">Set up the administrator account for managing your platform.</p>

                <div class="form-group">
                    <label class="form-label">Username <span class="required">*</span></label>
                    <input type="text" class="form-input" id="adminUser" placeholder="admin" autocomplete="off">
                    <p class="form-error" id="adminUserError">Username must be at least 4 characters.</p>
                </div>

                <div class="form-group">
                    <label class="form-label">Email Address <span class="required">*</span></label>
                    <input type="email" class="form-input" id="adminEmail" placeholder="admin@example.com" autocomplete="off">
                    <p class="form-error" id="adminEmailError">Please enter a valid email address.</p>
                </div>

                <div class="form-group">
                    <label class="form-label">Password <span class="required">*</span></label>
                    <input type="password" class="form-input" id="adminPass" placeholder="Minimum 8 characters" autocomplete="new-password" oninput="updatePasswordStrength()">
                    <div class="password-strength">
                        <div class="password-strength-bar">
                            <div class="password-strength-fill" id="passStrengthFill"></div>
                        </div>
                        <div class="password-strength-text" id="passStrengthText"></div>
                    </div>
                    <p class="form-error" id="adminPassError">Password must be at least 8 characters.</p>
                </div>

                <div class="form-group">
                    <label class="form-label">Confirm Password <span class="required">*</span></label>
                    <input type="password" class="form-input" id="adminPassConfirm" placeholder="Re-enter password" autocomplete="new-password">
                    <p class="form-error" id="adminPassConfirmError">Passwords do not match.</p>
                </div>

                <div class="btn-group">
                    <button class="btn btn-outline" onclick="goToStep(5)">← Back</button>
                    <button class="btn btn-gold" onclick="validateStep6()">Continue →</button>
                </div>
            </div>

            <!-- ==============================
                 STEP 7: Installation Progress
                 ============================== -->
            <div class="step-panel" id="step7">
                <h3 class="step-title">Installing iGamingApi</h3>
                <p class="step-subtitle">Please wait while we set up your platform. This may take a moment.</p>

                <div class="progress-container">
                    <div class="progress-bar-wrapper">
                        <div class="progress-bar-fill" id="installProgressBar"></div>
                    </div>

                    <ul class="install-step-list" id="installStepList">
                        <li class="install-step-item" data-install-step="1">
                            <span class="install-step-icon">1</span>
                            <span class="install-step-text">Creating configuration file...</span>
                        </li>
                        <li class="install-step-item" data-install-step="2">
                            <span class="install-step-icon">2</span>
                            <span class="install-step-text">Importing database schema...</span>
                        </li>
                        <li class="install-step-item" data-install-step="3">
                            <span class="install-step-icon">3</span>
                            <span class="install-step-text">Creating admin account...</span>
                        </li>
                        <li class="install-step-item" data-install-step="4">
                            <span class="install-step-icon">4</span>
                            <span class="install-step-text">Generating encryption key...</span>
                        </li>
                        <li class="install-step-item" data-install-step="5">
                            <span class="install-step-icon">5</span>
                            <span class="install-step-text">Setting up directories...</span>
                        </li>
                        <li class="install-step-item" data-install-step="6">
                            <span class="install-step-icon">6</span>
                            <span class="install-step-text">Inserting default data...</span>
                        </li>
                        <li class="install-step-item" data-install-step="7">
                            <span class="install-step-icon">7</span>
                            <span class="install-step-text">Configuring security settings...</span>
                        </li>
                    </ul>
                </div>

                <div id="installError" class="hidden">
                    <div class="alert alert-danger">
                        <span class="alert-icon">✗</span>
                        <span id="installErrorMsg"></span>
                    </div>
                    <button class="btn btn-outline btn-block" onclick="goToStep(4)">← Go Back &amp; Fix</button>
                </div>
            </div>

            <!-- ==============================
                 STEP 8: Installation Complete
                 ============================== -->
            <div class="step-panel" id="step8">
                <div class="completion-content">
                    <div class="success-checkmark">✓</div>
                    <h2 class="completion-title">Installation Successful!</h2>
                    <p class="text-secondary" style="font-size:0.9rem;">
                        iGamingApi has been installed and configured successfully.<br>
                        Your platform is ready to use.
                    </p>

                    <div class="completion-info">
                        <div class="completion-info-row">
                            <span class="completion-info-label">Admin Panel</span>
                            <span class="completion-info-value">
                                <a href="#" id="adminPanelLink" target="_blank">Open Admin Panel ↗</a>
                            </span>
                        </div>
                        <div class="completion-info-row">
                            <span class="completion-info-label">Username</span>
                            <span class="completion-info-value" id="completionUsername"></span>
                        </div>
                        <div class="completion-info-row">
                            <span class="completion-info-label">Version</span>
                            <span class="completion-info-value">1.0.0</span>
                        </div>
                    </div>

                    <div class="alert alert-warning completion-warning">
                        <span class="alert-icon">⚠</span>
                        <span>For security, <strong>install.php</strong> has been renamed to <strong>install.php.bak</strong>. If it wasn't auto-renamed, please delete it manually.</span>
                    </div>

                    <a href="#" id="btnGoAdmin" class="btn btn-gold btn-block mt-24">
                        Go to Admin Panel →
                    </a>
                </div>
            </div>

        </div><!-- /.installer-card-inner -->
    </div><!-- /.installer-card -->
<?php endif; ?>
</div><!-- /.installer-container -->

<?php if (!$alreadyInstalled): ?>
<script>
(function() {
    'use strict';

    // ============================================================
    // STATE
    // ============================================================
    var currentStep = 1;
    var totalSteps = 8;
    var dbTestPassed = false;

    var serverRequirements = <?php echo $requirementsJson; ?>;
    var folderPermissions = <?php echo $folderChecksJson; ?>;

    // Store form data
    var formData = {
        db_host: 'localhost',
        db_name: '',
        db_user: '',
        db_pass: '',
        db_port: 3306,
        create_db: false,
        app_url: '',
        app_name: 'iGamingApi',
        default_currency: 'INR',
        timezone: 'Asia/Kolkata',
        admin_username: '',
        admin_email: '',
        admin_password: ''
    };

    // ============================================================
    // STEP NAVIGATION
    // ============================================================
    window.goToStep = function(step) {
        if (step < 1 || step > totalSteps) return;

        // Save current form data before switching
        saveCurrentFormData();

        // Hide current step
        var currentPanel = document.getElementById('step' + currentStep);
        if (currentPanel) {
            currentPanel.classList.remove('active');
        }

        // Show new step
        currentStep = step;
        var newPanel = document.getElementById('step' + step);
        if (newPanel) {
            // Small delay for animation
            setTimeout(function() {
                newPanel.classList.add('active');
            }, 50);
        }

        // Update step indicator
        updateStepIndicator();

        // Step-specific initialization
        if (step === 2) {
            renderRequirements();
        } else if (step === 3) {
            renderFolders();
        } else if (step === 7) {
            startInstallation();
        }
    };

    function updateStepIndicator() {
        var dots = document.querySelectorAll('.step-dot');
        var lines = document.querySelectorAll('.step-line');

        dots.forEach(function(dot) {
            var dotStep = parseInt(dot.getAttribute('data-step'));
            dot.classList.remove('active', 'completed');
            if (dotStep === currentStep) {
                dot.classList.add('active');
            } else if (dotStep < currentStep) {
                dot.classList.add('completed');
            }
        });

        lines.forEach(function(line) {
            var afterStep = parseInt(line.getAttribute('data-after'));
            line.classList.remove('completed');
            if (afterStep < currentStep) {
                line.classList.add('completed');
            }
        });
    }

    function saveCurrentFormData() {
        // Save DB fields
        var dbHost = document.getElementById('dbHost');
        var dbPort = document.getElementById('dbPort');
        var dbName = document.getElementById('dbName');
        var dbUser = document.getElementById('dbUser');
        var dbPass = document.getElementById('dbPass');
        var dbCreate = document.getElementById('dbCreate');

        if (dbHost) formData.db_host = dbHost.value;
        if (dbPort) formData.db_port = parseInt(dbPort.value) || 3306;
        if (dbName) formData.db_name = dbName.value;
        if (dbUser) formData.db_user = dbUser.value;
        if (dbPass) formData.db_pass = dbPass.value;
        if (dbCreate) formData.create_db = dbCreate.checked;

        // Save App fields
        var appUrl = document.getElementById('appUrl');
        var appName = document.getElementById('appName');
        var appCurrency = document.getElementById('appCurrency');
        var appTimezone = document.getElementById('appTimezone');

        if (appUrl) formData.app_url = appUrl.value.replace(/\/+$/, '');
        if (appName) formData.app_name = appName.value;
        if (appCurrency) formData.default_currency = appCurrency.value;
        if (appTimezone) formData.timezone = appTimezone.value;

        // Save Admin fields
        var adminUser = document.getElementById('adminUser');
        var adminEmail = document.getElementById('adminEmail');
        var adminPass = document.getElementById('adminPass');

        if (adminUser) formData.admin_username = adminUser.value;
        if (adminEmail) formData.admin_email = adminEmail.value;
        if (adminPass) formData.admin_password = adminPass.value;
    }

    // ============================================================
    // STEP 2: Server Requirements
    // ============================================================
    function renderRequirements() {
        var container = document.getElementById('requirementsList');
        container.innerHTML = '';

        var allCriticalPassed = true;

        serverRequirements.forEach(function(req) {
            var passed = req.passed;
            var critical = req.critical;

            if (critical && !passed) {
                allCriticalPassed = false;
            }

            var statusClass = passed ? 'pass' : (critical ? 'fail' : 'warn');
            var statusIcon = passed ? '✓' : (critical ? '✗' : '⚠');

            var item = document.createElement('div');
            item.className = 'check-item';
            item.innerHTML = '<div class="check-item-info">' +
                '<span class="check-item-name">' + escapeHtml(req.name) + (!critical ? ' <small style="color:var(--warning)">(optional)</small>' : '') + '</span>' +
                '<span class="check-item-detail">Required: ' + escapeHtml(req.required) + ' &middot; Current: ' + escapeHtml(req.current) + '</span>' +
                '</div>' +
                '<span class="check-item-status ' + statusClass + '">' + statusIcon + '</span>';
            container.appendChild(item);
        });

        var btnContinue = document.getElementById('btnReqContinue');
        btnContinue.disabled = !allCriticalPassed;
    }

    window.recheckRequirements = function() {
        // Reload page to recheck PHP requirements
        window.location.reload();
    };

    // ============================================================
    // STEP 3: Folder Permissions
    // ============================================================
    function renderFolders() {
        var container = document.getElementById('foldersList');
        container.innerHTML = '';

        var allOk = true;

        folderPermissions.forEach(function(folder) {
            var passed = folder.writable;
            if (!passed) allOk = false;

            var statusClass = passed ? 'pass' : 'fail';
            var statusIcon = passed ? '✓' : '✗';
            var statusText = !folder.exists ? 'Does not exist' : (passed ? 'Writable' : 'Not writable');

            var item = document.createElement('div');
            item.className = 'check-item';
            item.innerHTML = '<div class="check-item-info">' +
                '<span class="check-item-name">' + escapeHtml(folder.path) + '</span>' +
                '<span class="check-item-detail">' + statusText + '</span>' +
                '</div>' +
                '<span class="check-item-status ' + statusClass + '">' + statusIcon + '</span>';
            container.appendChild(item);
        });

        var btnContinue = document.getElementById('btnFolderContinue');
        btnContinue.disabled = !allOk;
    }

    window.fixPermissions = function() {
        var btn = document.getElementById('btnFixPerms');
        btn.disabled = true;
        btn.innerHTML = '<span class="spinner spinner-sm"></span> Fixing...';

        ajaxPost('', { action_fix_permissions: '1' }, function(response) {
            btn.disabled = false;
            btn.innerHTML = '🔧 Fix Permissions';

            if (response && response.results) {
                // Update folder permissions data
                folderPermissions.forEach(function(fp, idx) {
                    if (response.results[idx]) {
                        fp.writable = response.results[idx].fixed;
                        fp.exists = true;
                    }
                });
                renderFolders();
            } else {
                // Reload to recheck
                window.location.reload();
            }
        }, function() {
            btn.disabled = false;
            btn.innerHTML = '🔧 Fix Permissions';
            window.location.reload();
        });
    };

    // ============================================================
    // STEP 4: Database Configuration
    // ============================================================
    window.testDatabase = function() {
        var btn = document.getElementById('btnTestDb');
        var spinner = document.getElementById('dbTestSpinner');
        var btnText = document.getElementById('dbTestBtnText');
        var resultDiv = document.getElementById('dbTestResult');

        saveCurrentFormData();

        if (!formData.db_host || !formData.db_name || !formData.db_user) {
            showDbTestResult(false, 'Please fill in all required fields (Host, Database Name, Username).');
            return;
        }

        btn.disabled = true;
        spinner.style.display = 'inline-block';
        btnText.textContent = 'Testing...';

        var postData = {
            action: 'test_db',
            db_host: formData.db_host,
            db_name: formData.db_name,
            db_user: formData.db_user,
            db_pass: formData.db_pass,
            db_port: formData.db_port.toString(),
            create_db: formData.create_db ? '1' : '0'
        };

        ajaxPost(window.location.href, postData, function(response) {
            btn.disabled = false;
            spinner.style.display = 'none';
            btnText.textContent = '⚡ Test Connection';

            if (response.success) {
                dbTestPassed = true;
                showDbTestResult(true, response.message);
                document.getElementById('btnDbContinue').disabled = false;
            } else {
                dbTestPassed = false;
                showDbTestResult(false, response.message);
                document.getElementById('btnDbContinue').disabled = true;
            }
        }, function(error) {
            btn.disabled = false;
            spinner.style.display = 'none';
            btnText.textContent = '⚡ Test Connection';
            showDbTestResult(false, 'Request failed. Please check your server configuration.');
        });
    };

    function showDbTestResult(success, message) {
        var resultDiv = document.getElementById('dbTestResult');
        resultDiv.style.display = 'block';
        resultDiv.className = 'db-test-result';

        var alertClass = success ? 'alert-success' : 'alert-danger';
        var icon = success ? '✓' : '✗';

        resultDiv.innerHTML = '<div class="alert ' + alertClass + '">' +
            '<span class="alert-icon">' + icon + '</span>' +
            '<span>' + escapeHtml(message) + '</span>' +
            '</div>';
    }

    // Reset DB test when fields change
    document.addEventListener('DOMContentLoaded', function() {
        var dbFields = ['dbHost', 'dbPort', 'dbName', 'dbUser', 'dbPass', 'dbCreate'];
        dbFields.forEach(function(id) {
            var el = document.getElementById(id);
            if (el) {
                el.addEventListener('input', function() {
                    dbTestPassed = false;
                    document.getElementById('btnDbContinue').disabled = true;
                    document.getElementById('dbTestResult').style.display = 'none';
                });
                if (el.type === 'checkbox') {
                    el.addEventListener('change', function() {
                        dbTestPassed = false;
                        document.getElementById('btnDbContinue').disabled = true;
                        document.getElementById('dbTestResult').style.display = 'none';
                    });
                }
            }
        });
    });

    // ============================================================
    // STEP 5: Application Setup Validation
    // ============================================================
    window.validateStep5 = function() {
        saveCurrentFormData();

        var valid = true;

        var appUrl = document.getElementById('appUrl');
        var appName = document.getElementById('appName');

        // Reset states
        appUrl.classList.remove('error');
        appName.classList.remove('error');

        if (!formData.app_url || formData.app_url.length < 5) {
            appUrl.classList.add('error');
            valid = false;
        }

        if (!formData.app_name || formData.app_name.length < 1) {
            appName.classList.add('error');
            valid = false;
        }

        if (valid) {
            goToStep(6);
        }
    };

    // ============================================================
    // STEP 6: Admin Validation
    // ============================================================
    window.validateStep6 = function() {
        saveCurrentFormData();

        var valid = true;

        var userInput = document.getElementById('adminUser');
        var emailInput = document.getElementById('adminEmail');
        var passInput = document.getElementById('adminPass');
        var passConfInput = document.getElementById('adminPassConfirm');

        var userErr = document.getElementById('adminUserError');
        var emailErr = document.getElementById('adminEmailError');
        var passErr = document.getElementById('adminPassError');
        var passConfErr = document.getElementById('adminPassConfirmError');

        // Reset
        userInput.classList.remove('error');
        emailInput.classList.remove('error');
        passInput.classList.remove('error');
        passConfInput.classList.remove('error');
        userErr.classList.remove('show');
        emailErr.classList.remove('show');
        passErr.classList.remove('show');
        passConfErr.classList.remove('show');

        // Username
        if (!formData.admin_username || formData.admin_username.length < 4) {
            userInput.classList.add('error');
            userErr.classList.add('show');
            valid = false;
        }

        // Email
        var emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
        if (!formData.admin_email || !emailRegex.test(formData.admin_email)) {
            emailInput.classList.add('error');
            emailErr.classList.add('show');
            valid = false;
        }

        // Password
        if (!formData.admin_password || formData.admin_password.length < 8) {
            passInput.classList.add('error');
            passErr.classList.add('show');
            valid = false;
        }

        // Confirm password
        var confirmVal = passConfInput.value;
        if (confirmVal !== formData.admin_password) {
            passConfInput.classList.add('error');
            passConfErr.classList.add('show');
            valid = false;
        }

        if (valid) {
            goToStep(7);
        }
    };

    // ============================================================
    // PASSWORD STRENGTH METER
    // ============================================================
    window.updatePasswordStrength = function() {
        var pass = document.getElementById('adminPass').value;
        var fill = document.getElementById('passStrengthFill');
        var text = document.getElementById('passStrengthText');

        var score = 0;

        if (pass.length >= 8) score++;
        if (pass.length >= 12) score++;
        if (/[a-z]/.test(pass)) score++;
        if (/[A-Z]/.test(pass)) score++;
        if (/[0-9]/.test(pass)) score++;
        if (/[^a-zA-Z0-9]/.test(pass)) score++;

        var percent = 0;
        var color = '';
        var label = '';

        if (pass.length === 0) {
            percent = 0;
            color = 'transparent';
            label = '';
        } else if (score <= 2) {
            percent = 25;
            color = '#ff4757';
            label = 'Weak';
        } else if (score <= 3) {
            percent = 50;
            color = '#ffa502';
            label = 'Fair';
        } else if (score <= 4) {
            percent = 75;
            color = '#f9ca24';
            label = 'Good';
        } else {
            percent = 100;
            color = '#2ed573';
            label = 'Strong';
        }

        fill.style.width = percent + '%';
        fill.style.background = color;
        text.textContent = label;
        text.style.color = color;
    };

    // ============================================================
    // STEP 7: Installation Process
    // ============================================================
    function startInstallation() {
        saveCurrentFormData();

        var steps = document.querySelectorAll('.install-step-item');
        var progressBar = document.getElementById('installProgressBar');
        var errorDiv = document.getElementById('installError');
        var errorMsg = document.getElementById('installErrorMsg');

        // Reset all steps
        errorDiv.classList.add('hidden');
        steps.forEach(function(s) {
            s.className = 'install-step-item';
        });
        progressBar.style.width = '0%';

        var totalInstallSteps = 7;
        var currentInstallStep = 0;

        function animateStep(stepNum) {
            if (stepNum > totalInstallSteps) {
                // All visual steps done, now make the AJAX call
                return;
            }

            currentInstallStep = stepNum;
            var stepEl = document.querySelector('.install-step-item[data-install-step="' + stepNum + '"]');

            if (stepEl) {
                stepEl.classList.add('processing');
                var icon = stepEl.querySelector('.install-step-icon');
                if (icon) {
                    icon.innerHTML = '<span class="spinner"></span>';
                }
            }

            var percent = Math.round((stepNum / totalInstallSteps) * 100);
            progressBar.style.width = percent + '%';
        }

        function completeStep(stepNum) {
            var stepEl = document.querySelector('.install-step-item[data-install-step="' + stepNum + '"]');
            if (stepEl) {
                stepEl.classList.remove('processing');
                stepEl.classList.add('completed');
                var icon = stepEl.querySelector('.install-step-icon');
                if (icon) {
                    icon.innerHTML = '✓';
                }
            }
        }

        function failStep(stepNum, message) {
            var stepEl = document.querySelector('.install-step-item[data-install-step="' + stepNum + '"]');
            if (stepEl) {
                stepEl.classList.remove('processing');
                stepEl.classList.add('failed');
                var icon = stepEl.querySelector('.install-step-icon');
                if (icon) {
                    icon.innerHTML = '✗';
                }
            }
            errorDiv.classList.remove('hidden');
            errorMsg.textContent = message;
        }

        // Start visual animation sequence, then send AJAX
        var delay = 400;

        // Animate step 1
        animateStep(1);

        // Send the actual AJAX request
        var postData = {
            action: 'install',
            db_host: formData.db_host,
            db_name: formData.db_name,
            db_user: formData.db_user,
            db_pass: formData.db_pass,
            db_port: formData.db_port.toString(),
            app_url: formData.app_url,
            app_name: formData.app_name,
            default_currency: formData.default_currency,
            timezone: formData.timezone,
            admin_username: formData.admin_username,
            admin_email: formData.admin_email,
            admin_password: formData.admin_password
        };

        ajaxPost(window.location.href, postData, function(response) {
            if (response.success) {
                // Animate through all steps with delays
                var stepDelay = 0;

                for (var i = 1; i <= totalInstallSteps; i++) {
                    (function(step) {
                        setTimeout(function() {
                            animateStep(step);
                        }, stepDelay);

                        setTimeout(function() {
                            completeStep(step);
                        }, stepDelay + 500);
                    })(i);
                    stepDelay += 600;
                }

                // After all steps complete, go to step 8
                setTimeout(function() {
                    progressBar.style.width = '100%';

                    // Set completion data
                    var adminUrl = response.admin_url || (formData.app_url + '/admin');
                    document.getElementById('adminPanelLink').href = adminUrl;
                    document.getElementById('btnGoAdmin').href = adminUrl;
                    document.getElementById('completionUsername').textContent = formData.admin_username;

                    setTimeout(function() {
                        goToStep(8);
                    }, 600);
                }, stepDelay + 400);

            } else {
                // Error occurred
                var failedStep = response.step || 1;
                var stepDelay = 0;

                // Animate and complete steps before the failed one
                for (var i = 1; i < failedStep; i++) {
                    (function(step) {
                        setTimeout(function() {
                            animateStep(step);
                        }, stepDelay);
                        setTimeout(function() {
                            completeStep(step);
                        }, stepDelay + 400);
                    })(i);
                    stepDelay += 500;
                }

                // Show the failing step
                setTimeout(function() {
                    animateStep(failedStep);
                    setTimeout(function() {
                        failStep(failedStep, response.message || 'An unknown error occurred.');
                    }, 500);
                }, stepDelay);
            }

        }, function(error) {
            // Network or server error
            animateStep(1);
            setTimeout(function() {
                failStep(1, 'Server request failed. Please check your server configuration and try again.');
            }, 500);
        });
    }

    // ============================================================
    // AJAX UTILITY (XMLHttpRequest)
    // ============================================================
    function ajaxPost(url, data, onSuccess, onError) {
        var xhr = new XMLHttpRequest();
        xhr.open('POST', url || window.location.href, true);
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');

        xhr.onreadystatechange = function() {
            if (xhr.readyState === 4) {
                if (xhr.status === 200) {
                    try {
                        var response = JSON.parse(xhr.responseText);
                        onSuccess(response);
                    } catch (e) {
                        if (onError) onError('Invalid JSON response: ' + xhr.responseText.substring(0, 200));
                    }
                } else {
                    if (onError) onError('HTTP ' + xhr.status + ': ' + xhr.statusText);
                }
            }
        };

        xhr.onerror = function() {
            if (onError) onError('Network error');
        };

        // Encode data
        var params = [];
        for (var key in data) {
            if (data.hasOwnProperty(key)) {
                params.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]));
            }
        }

        xhr.send(params.join('&'));
    }

    // ============================================================
    // UTILITY
    // ============================================================
    function escapeHtml(text) {
        var div = document.createElement('div');
        div.appendChild(document.createTextNode(text));
        return div.innerHTML;
    }

    // ============================================================
    // INIT
    // ============================================================
    document.addEventListener('DOMContentLoaded', function() {
        updateStepIndicator();
    });

})();
</script>
<?php endif; ?>

</body>
</html>
