<?php
declare(strict_types=1);

error_reporting(E_ALL);
ini_set('display_errors', '0');

$ERROR = [];
$SUCCESS = [];
$botDetails = null;
$botFirstMessage = null;
$webhookBaseUrl = '';
$configDomainHosts = '';

$rootDirectory = realpath(__DIR__ . '/..');
if ($rootDirectory === false) {
    die('مسیر ریشه پروژه پیدا نشد.');
}
$rootDirectory .= DIRECTORY_SEPARATOR;

$configFile   = $rootDirectory . 'config.php';
$tableFile    = $rootDirectory . 'table.php';
$projectIndex = $rootDirectory . 'index.php';

if (!file_exists($configFile)) {
    $ERROR[] = 'فایل config.php در ریشه پروژه پیدا نشد.';
}
if (!file_exists($tableFile)) {
    $ERROR[] = 'فایل table.php در ریشه پروژه پیدا نشد.';
}
if (!file_exists($projectIndex)) {
    $ERROR[] = 'فایل index.php اصلی پروژه در ریشه پیدا نشد.';
}

if (version_compare(PHP_VERSION, '8.2', '<')) {
    $ERROR[] = 'نسخه PHP باید حداقل 8.2 باشد.';
    $ERROR[] = 'نسخه فعلی: ' . PHP_VERSION;
}

$uPOST = sanitizeInput($_POST, [
    'remove_spaces' => true,
    'max_length' => 500,
]);

$defaultWebhook = detectProjectUrl() . '/index.php';

if (isset($uPOST['submit'])) {
    $ERROR = [];
    $SUCCESS = [];

    $adminId         = trim((string)($uPOST['admin_id'] ?? ''));
    $botToken        = trim((string)($uPOST['tg_bot_token'] ?? ''));
    $dbHost          = trim((string)($uPOST['database_host'] ?? 'localhost'));
    $dbName          = trim((string)($uPOST['database_name'] ?? ''));
    $dbUsername      = trim((string)($uPOST['database_username'] ?? ''));
    $dbPassword      = trim((string)($uPOST['database_password'] ?? ''));
    $botWebhookUrl   = trim((string)($uPOST['bot_address_webhook'] ?? $defaultWebhook));
    $removeInstaller = !empty($uPOST['remove_installer']);

    if (!isHttpsRequest()) {
        $ERROR[] = 'برای فعال‌سازی ربات تلگرام باید SSL فعال باشد و صفحه نصب با https باز شود.';
    }

    if (!filter_var($botWebhookUrl, FILTER_VALIDATE_URL)) {
        $ERROR[] = 'آدرس وبهوک معتبر نیست.';
    }

    if (!isValidTelegramToken($botToken)) {
        $ERROR[] = 'توکن ربات تلگرام معتبر نیست.';
    }

    if (!isValidTelegramId($adminId)) {
        $ERROR[] = 'آیدی عددی ادمین معتبر نیست.';
    }

    if ($dbHost === '') {
        $ERROR[] = 'هاست دیتابیس نمی‌تواند خالی باشد.';
    }

    if ($dbName === '') {
        $ERROR[] = 'نام دیتابیس نمی‌تواند خالی باشد.';
    }

    if ($dbUsername === '') {
        $ERROR[] = 'نام کاربری دیتابیس نمی‌تواند خالی باشد.';
    }

    $webhookBaseUrl = extractProjectBaseUrl($botWebhookUrl);
    if ($webhookBaseUrl === '') {
        $ERROR[] = 'دامنه/آدرس پروژه از روی آدرس وبهوک قابل تشخیص نیست.';
    }

    $configDomainHosts = $webhookBaseUrl !== '' ? toMirzaDomainHosts($webhookBaseUrl) : '';
    if ($configDomainHosts === '') {
        $ERROR[] = 'مقدار domainhosts برای config.php قابل ساخت نیست.';
    }

    if (empty($ERROR) && !is_readable($configFile)) {
        $ERROR[] = 'فایل config.php قابل خواندن نیست.';
    }

    if (empty($ERROR) && !is_writable($configFile)) {
        $ERROR[] = 'فایل config.php قابل نوشتن نیست. سطح دسترسی فایل را بررسی کنید.';
    }

    if (empty($ERROR)) {
        $botDetails = telegramRequest($botToken, 'getMe');

        if (!$botDetails || empty($botDetails['ok'])) {
            $ERROR[] = 'توکن ربات نامعتبر است یا سرور به تلگرام متصل نشد.';
        } else {
            $adminCheck = telegramRequest($botToken, 'getChat', [
                'chat_id' => $adminId
            ]);

            if (!$adminCheck || empty($adminCheck['ok'])) {
                $ERROR[] = 'مدیر ربات توسط تلگرام شناسایی نشد.';
                $ERROR[] = 'ابتدا با اکانت مدیر، ربات را استارت کنید.';
                if (!empty($botDetails['result']['username'])) {
                    $botUsername = (string)$botDetails['result']['username'];
                    $ERROR[] = 'آدرس ربات: <a href="https://t.me/' . e($botUsername) . '" target="_blank">@' . e($botUsername) . '</a>';
                }
            }
        }
    }

    if (empty($ERROR)) {
        try {
            $dsn = "mysql:host={$dbHost};dbname={$dbName};charset=utf8mb4";
            $pdo = new PDO($dsn, $dbUsername, $dbPassword, [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_EMULATE_PREPARES => false,
            ]);
            $SUCCESS[] = '✅ اتصال به دیتابیس با موفقیت انجام شد.';
        } catch (PDOException $e) {
            $ERROR[] = '❌ اتصال به دیتابیس ناموفق بود.';
            $ERROR[] = 'اطلاعات دیتابیس را بررسی کنید.';
            $ERROR[] = '<code>' . e($e->getMessage()) . '</code>';
        }
    }

    if (empty($ERROR)) {
        $rawConfig = file_get_contents($configFile);

        if ($rawConfig === false) {
            $ERROR[] = 'خواندن فایل config.php انجام نشد.';
        } else {
            $botUsername = (string)($botDetails['result']['username'] ?? '');

            $replacements = [
                "/\\\$dbhost\s*=\s*'[^']*';/"      => "\$dbhost = '" . escapePhpSingleQuoted($dbHost) . "';",
                "/\\\$dbname\s*=\s*'[^']*';/"      => "\$dbname = '" . escapePhpSingleQuoted($dbName) . "';",
                "/\\\$usernamedb\s*=\s*'[^']*';/"  => "\$usernamedb = '" . escapePhpSingleQuoted($dbUsername) . "';",
                "/\\\$passworddb\s*=\s*'[^']*';/"  => "\$passworddb = '" . escapePhpSingleQuoted($dbPassword) . "';",
                "/\\\$APIKEY\s*=\s*'[^']*';/"      => "\$APIKEY = '" . escapePhpSingleQuoted($botToken) . "';",
                "/\\\$adminnumber\s*=\s*'[^']*';/" => "\$adminnumber = '" . escapePhpSingleQuoted($adminId) . "';",
                "/\\\$domainhosts\s*=\s*'[^']*';/" => "\$domainhosts = '" . escapePhpSingleQuoted($configDomainHosts) . "';",
                "/\\\$usernamebot\s*=\s*'[^']*';/" => "\$usernamebot = '" . escapePhpSingleQuoted($botUsername) . "';",
            ];

            $newConfig = $rawConfig;
            $totalReplaced = 0;

            foreach ($replacements as $pattern => $replacement) {
                $newConfig = preg_replace($pattern, $replacement, $newConfig, 1, $count);
                $totalReplaced += (int)$count;
            }

            if ($totalReplaced < 6) {
                $ERROR[] = 'ساختار config.php با این installer سازگار نیست یا متغیرهای لازم پیدا نشدند.';
            } else {
                $backupFile = $configFile . '.bak-' . date('Ymd-His');
                @file_put_contents($backupFile, $rawConfig);

                if (file_put_contents($configFile, $newConfig) === false) {
                    $ERROR[] = 'بازنویسی فایل config.php انجام نشد.';
                } else {
                    $SUCCESS[] = '✅ فایل config.php با موفقیت بروزرسانی شد.';
                }
            }
        }
    }

    if (empty($ERROR)) {
        try {
            require_once $tableFile;
            $SUCCESS[] = '✅ فایل table.php اجرا شد و جداول بررسی/ایجاد شدند.';
        } catch (Throwable $e) {
            $ERROR[] = 'اجرای table.php با خطا مواجه شد.';
            $ERROR[] = '<code>' . e($e->getMessage()) . '</code>';
        }
    }

    if (empty($ERROR)) {
        $finalWebhookUrl = rtrim($webhookBaseUrl, '/') . '/index.php';
        $setWebhook = telegramRequest($botToken, 'setWebhook', [
            'url' => $finalWebhookUrl
        ]);

        if (!$setWebhook || empty($setWebhook['ok'])) {
            $ERROR[] = 'وبهوک ربات ثبت نشد.';
            $ERROR[] = 'SSL یا آدرس وبهوک را بررسی کنید.';
        } else {
            $SUCCESS[] = '✅ وبهوک ربات با موفقیت ثبت شد.';
            $SUCCESS[] = 'آدرس وبهوک ثبت‌شده: <code>' . e($finalWebhookUrl) . '</code>';
            $SUCCESS[] = 'مقدار domainhosts ذخیره‌شده در config.php: <code>' . e($configDomainHosts) . '</code>';
        }
    }

    if (empty($ERROR)) {
        $botFirstMessage = "\n[🤖] شما به عنوان ادمین اصلی ربات ثبت شدید.";

        telegramRequest($botToken, 'sendMessage', [
            'chat_id' => $adminId,
            'text' => "✅ ربات با موفقیت نصب شد." . $botFirstMessage,
            'reply_markup' => json_encode([
                'inline_keyboard' => [
                    [
                        [
                            'text' => '⚙️ ورود به پنل ادمین',
                            'callback_data' => 'PANEL'
                        ]
                    ]
                ]
            ], JSON_UNESCAPED_UNICODE)
        ]);

        $SUCCESS[] = '✅ ربات با موفقیت نصب شد.';
    }

    if (empty($ERROR) && $removeInstaller) {
        $deleteResult = installerDeleteDirectory(__DIR__);
        if ($deleteResult) {
            $SUCCESS[] = '✅ پوشه installer حذف شد.';
        } else {
            $SUCCESS[] = '⚠️ نصب کامل شد، اما حذف خودکار پوشه installer انجام نشد. آن را دستی حذف کنید.';
        }
    }
}

function telegramRequest(string $token, string $method, array $params = []): ?array
{
    $url = "https://api.telegram.org/bot{$token}/{$method}";

    $context = stream_context_create([
        'http' => [
            'method'  => 'POST',
            'header'  => "Content-Type: application/x-www-form-urlencoded\r\n",
            'content' => http_build_query($params),
            'timeout' => 20,
        ]
    ]);

    $response = @file_get_contents($url, false, $context);
    if ($response === false) {
        return null;
    }

    $decoded = json_decode($response, true);
    return is_array($decoded) ? $decoded : null;
}

function isValidTelegramToken(string $token): bool
{
    return (bool)preg_match('/^\d{6,12}:[A-Za-z0-9_-]{35}$/', $token);
}

function isValidTelegramId(string $id): bool
{
    return (bool)preg_match('/^\d{6,15}$/', $id);
}

function sanitizeInput($input, array $options = [])
{
    $defaultOptions = [
        'allow_html'    => false,
        'allowed_tags'  => '',
        'remove_spaces' => false,
        'max_length'    => 0,
        'encoding'      => 'UTF-8',
    ];

    $options = array_merge($defaultOptions, $options);

    if (is_array($input)) {
        $result = [];
        foreach ($input as $key => $value) {
            $result[$key] = sanitizeInput($value, $options);
        }
        return $result;
    }

    if ($input === null || $input === false) {
        return '';
    }

    $input = (string)$input;
    $input = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/u', '', $input) ?? '';

    if ($options['max_length'] > 0) {
        $input = mb_substr($input, 0, $options['max_length'], $options['encoding']);
    }

    if (!$options['allow_html']) {
        $input = strip_tags($input);
    } elseif ($options['allowed_tags'] !== '') {
        $input = strip_tags($input, $options['allowed_tags']);
    }

    if ($options['remove_spaces']) {
        $input = preg_replace('/\s+/', ' ', trim($input)) ?? trim($input);
    }

    return $input;
}

function e(string $value): string
{
    return htmlspecialchars($value, ENT_QUOTES | ENT_HTML5, 'UTF-8');
}

function escapePhpSingleQuoted(string $value): string
{
    return str_replace(['\\', '\''], ['\\\\', '\\\''], $value);
}

function isHttpsRequest(): bool
{
    if (
        (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ||
        ((int)($_SERVER['SERVER_PORT'] ?? 0) === 443) ||
        (($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? '') === 'https')
    ) {
        return true;
    }

    return false;
}

function detectProjectUrl(): string
{
    $scheme = isHttpsRequest() ? 'https' : 'http';
    $host = $_SERVER['HTTP_HOST'] ?? 'localhost';
    $script = $_SERVER['SCRIPT_NAME'] ?? '/installer/index.php';
    $base = str_replace('\\', '/', dirname(dirname($script)));
    $base = rtrim($base, '/');

    return $scheme . '://' . $host . ($base ? $base : '');
}

function extractProjectBaseUrl(string $url): string
{
    $parts = parse_url($url);
    if (!$parts || empty($parts['scheme']) || empty($parts['host'])) {
        return '';
    }

    $scheme = strtolower((string)$parts['scheme']);
    if (!in_array($scheme, ['http', 'https'], true)) {
        return '';
    }

    $host = (string)$parts['host'];
    $port = isset($parts['port']) ? ':' . (int)$parts['port'] : '';
    $path = $parts['path'] ?? '';
    $path = str_replace('\\', '/', $path);
    $path = preg_replace('#/+#', '/', $path) ?? '';

    if ($path === '' || $path === '/') {
        $basePath = '';
    } elseif (str_ends_with($path, '/index.php')) {
        $basePath = substr($path, 0, -10);
    } else {
        $basePath = dirname($path);
    }

    $basePath = trim((string)$basePath);
    $basePath = $basePath === '/' || $basePath === '.' ? '' : rtrim($basePath, '/');

    return $scheme . '://' . $host . $port . $basePath;
}

function toMirzaDomainHosts(string $baseUrl): string
{
    $parts = parse_url($baseUrl);
    if (!$parts || empty($parts['host'])) {
        return preg_replace('#^https?://#i', '', rtrim($baseUrl, '/')) ?? '';
    }

    $host = (string)$parts['host'];
    $port = isset($parts['port']) ? ':' . (int)$parts['port'] : '';
    $path = isset($parts['path']) ? rtrim((string)$parts['path'], '/') : '';

    return $host . $port . $path;
}

function extractDomainName(string $url): string
{
    // Backward-compatible alias for older calls.
    return extractProjectBaseUrl($url);
}

if (!function_exists('installerDeleteDirectory')) {
    function installerDeleteDirectory(string $dir): bool
    {
        if (!is_dir($dir)) {
            return false;
        }

        $items = scandir($dir);
        if ($items === false) {
            return false;
        }

        foreach ($items as $item) {
            if ($item === '.' || $item === '..') {
                continue;
            }

            $path = $dir . DIRECTORY_SEPARATOR . $item;

            if (is_dir($path)) {
                if (!installerDeleteDirectory($path)) {
                    return false;
                }
            } else {
                if (!@unlink($path)) {
                    return false;
                }
            }
        }

        return @rmdir($dir);
    }
}
?>
<!DOCTYPE html>
<html dir="rtl" lang="fa">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>نصب خودکار میرزا بات</title>
    <style>
        :root {
            --bg-dark: #182432;
            --card-dark: #1f2a3c;
            --primary: #3b82f6;
            --primary-hover: #2563eb;
            --text-color: #e5e7eb;
            --muted-color: #9ca3af;
            --input-bg: #1e293b;
            --input-border: #334155;
            --success: #4ade80;
            --danger: #f87171;
        }
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: Tahoma, Vazirmatn, Vazir, sans-serif;
        }
        body {
            background: var(--bg-dark);
            color: var(--text-color);
            min-height: 100vh;
            padding: 24px;
        }
        .container {
            background: var(--card-dark);
            max-width: 860px;
            margin: 0 auto;
            border-radius: 16px;
            padding: 32px;
            box-shadow: 0 18px 40px rgba(0,0,0,.28);
        }
        h1 {
            text-align: center;
            margin-bottom: 10px;
            color: #fff;
            font-size: 28px;
        }
        .subtitle {
            text-align: center;
            color: var(--muted-color);
            margin-bottom: 28px;
            font-size: 14px;
            line-height: 1.9;
        }
        .alert {
            padding: 14px 18px;
            margin-bottom: 18px;
            border-radius: 12px;
            border: 1px solid transparent;
            line-height: 1.9;
            font-size: 15px;
            word-break: break-word;
        }
        .alert-success {
            background: rgba(34, 197, 94, .12);
            color: var(--success);
            border-color: rgba(34, 197, 94, .24);
        }
        .alert-danger {
            background: rgba(239, 68, 68, .12);
            color: var(--danger);
            border-color: rgba(239, 68, 68, .24);
        }
        .form-group {
            margin-bottom: 18px;
        }
        label {
            display: block;
            margin-bottom: 8px;
            font-size: 14px;
            font-weight: 700;
        }
        .muted {
            color: var(--muted-color);
            font-size: 13px;
            margin-top: 4px;
            line-height: 1.8;
        }
        input[type="text"],
        input[type="password"],
        input[type="url"] {
            width: 100%;
            padding: 13px 14px;
            border-radius: 10px;
            border: 1px solid var(--input-border);
            background: var(--input-bg);
            color: #fff;
            font-size: 15px;
            direction: ltr;
        }
        input:focus {
            outline: none;
            border-color: var(--primary);
            box-shadow: 0 0 0 3px rgba(59,130,246,.18);
        }
        details {
            background: rgba(255,255,255,.03);
            border: 1px solid rgba(255,255,255,.06);
            border-radius: 10px;
            padding: 12px;
        }
        summary {
            cursor: pointer;
            color: #fff;
            font-weight: 700;
            margin-bottom: 12px;
        }
        .checkbox-wrap {
            display: flex;
            align-items: start;
            gap: 10px;
            background: rgba(255,255,255,.03);
            padding: 12px 14px;
            border-radius: 10px;
            border: 1px solid rgba(255,255,255,.06);
        }
        .checkbox-wrap input {
            width: auto;
            margin-top: 4px;
        }
        button {
            width: 100%;
            border: 0;
            border-radius: 12px;
            padding: 14px;
            background: var(--primary);
            color: #fff;
            font-size: 16px;
            font-weight: 700;
            cursor: pointer;
            transition: .2s ease;
            margin-top: 10px;
        }
        button:hover {
            background: var(--primary-hover);
        }
        .submit-success {
            display: block;
            text-align: center;
            width: 100%;
            padding: 14px;
            border-radius: 12px;
            margin: 12px 0 8px;
            background: rgba(34, 197, 94, .12);
            color: var(--success);
            border: 1px solid rgba(34, 197, 94, .24);
            text-decoration: none;
            font-weight: 700;
        }
        code {
            background: rgba(0,0,0,.22);
            padding: 2px 7px;
            border-radius: 7px;
            direction: ltr;
            display: inline-block;
        }
        a {
            color: #93c5fd;
            text-decoration: none;
        }
        footer {
            margin-top: 24px;
            text-align: center;
            color: var(--muted-color);
            font-size: 13px;
            line-height: 1.8;
        }
        @media (max-width: 768px) {
            body {
                padding: 0;
            }
            .container {
                min-height: 100vh;
                border-radius: 0;
                padding: 22px 16px;
            }
            h1 {
                font-size: 23px;
            }
        }
    </style>
</head>
<body>
<div class="container">
    <h1>⚙️ نصب خودکار میرزا بات</h1>
    <div class="subtitle">
        این فایل را داخل پوشه <code>installer</code> قرار دهید.<br>
        ساختار درست: <code>your-project/installer/index.php</code>
    </div>

    <?php if (!empty($ERROR)) { ?>
        <div class="alert alert-danger"><?php echo implode('<br>', $ERROR); ?></div>
    <?php } ?>

    <?php if (!empty($SUCCESS) && empty($ERROR)) { ?>
        <div class="alert alert-success"><?php echo implode('<br>', $SUCCESS); ?></div>

        <?php if (!empty($botDetails['result']['username'])) { ?>
            <a class="submit-success" href="https://t.me/<?php echo e((string)$botDetails['result']['username']); ?>" target="_blank">
                🤖 رفتن به ربات @<?php echo e((string)$botDetails['result']['username']); ?>
            </a>
        <?php } ?>
    <?php } ?>

    <?php if (empty($botFirstMessage)) { ?>
        <form method="post" autocomplete="off">
            <div class="form-group">
                <label for="admin_id">آیدی عددی ادمین</label>
                <input type="text" id="admin_id" name="admin_id" value="<?php echo e((string)($uPOST['admin_id'] ?? '')); ?>" placeholder="ADMIN TELEGRAM ID" required>
            </div>

            <div class="form-group">
                <label for="tg_bot_token">توکن ربات تلگرام</label>
                <input type="text" id="tg_bot_token" name="tg_bot_token" value="<?php echo e((string)($uPOST['tg_bot_token'] ?? '')); ?>" placeholder="BOT TOKEN" required>
            </div>

            <div class="form-group">
                <label for="database_host">هاست دیتابیس</label>
                <input type="text" id="database_host" name="database_host" value="<?php echo e((string)($uPOST['database_host'] ?? 'localhost')); ?>" placeholder="localhost" required>
            </div>

            <div class="form-group">
                <label for="database_username">نام کاربری دیتابیس</label>
                <input type="text" id="database_username" name="database_username" value="<?php echo e((string)($uPOST['database_username'] ?? '')); ?>" placeholder="DATABASE USERNAME" required>
            </div>

            <div class="form-group">
                <label for="database_password">رمز عبور دیتابیس</label>
                <input type="password" id="database_password" name="database_password" value="<?php echo e((string)($uPOST['database_password'] ?? '')); ?>" placeholder="DATABASE PASSWORD" required>
            </div>

            <div class="form-group">
                <label for="database_name">نام دیتابیس</label>
                <input type="text" id="database_name" name="database_name" value="<?php echo e((string)($uPOST['database_name'] ?? '')); ?>" placeholder="DATABASE NAME" required>
            </div>

            <div class="form-group">
                <details>
                    <summary>تنظیم آدرس وبهوک</summary>
                    <label for="bot_address_webhook">آدرس فایل index.php ربات</label>
                    <input type="url" id="bot_address_webhook" name="bot_address_webhook" value="<?php echo e((string)($uPOST['bot_address_webhook'] ?? $defaultWebhook)); ?>" placeholder="https://domain.com/path/index.php" required>
                    <div class="muted">
                        از این آدرس برای ساخت مقدار <code>$domainhosts</code> و ثبت webhook استفاده می‌شود.
                    </div>
                </details>
            </div>

            <div class="form-group">
                <div class="checkbox-wrap">
                    <input type="checkbox" id="remove_installer" name="remove_installer" value="1" <?php echo !empty($uPOST['remove_installer']) ? 'checked' : ''; ?>>
                    <label for="remove_installer" style="margin:0;font-weight:500;">
                        بعد از نصب موفق، پوشه installer به صورت خودکار حذف شود
                    </label>
                </div>
            </div>

            <button type="submit" name="submit" value="1">نصب ربات</button>
        </form>
    <?php } ?>

    <footer>
        MirzaBot One File Installer
    </footer>
</div>
</body>
</html>