<?php
require_once 'config.php';
require_once 'api/XrayAPI.php';

// Set headers for better error display and live feedback
header('Content-Type: text/html; charset=utf-8');
header('X-Content-Type-Options: nosniff');

function stream_message($type, $message, $details = '') {
    echo '<div class="alert alert-' . $type . '"><strong>' . htmlspecialchars($message) . '</strong>';
    if ($details) {
        echo '<pre class="mt-2">' . htmlspecialchars($details) . '</pre>';
    }
    echo '</div>';
    ob_flush();
    flush();
}

$page_title = 'تست اتصال پنل';
?>
<!DOCTYPE html>
<html lang="fa" dir="rtl">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title><?= htmlspecialchars($page_title) ?></title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.5/font/bootstrap-icons.css">
    <style>
        body { background-color: #f8f9fa; }
        .card-header { font-weight: bold; }
        pre { 
            background-color: #e9ecef; 
            padding: 15px;
            border-radius: 5px;
            white-space: pre-wrap;       /* Since CSS 2.1 */
            white-space: -moz-pre-wrap;  /* Mozilla, since 1999 */
            white-space: -pre-wrap;      /* Opera 4-6 */
            white-space: -o-pre-wrap;    /* Opera 7 */
            word-wrap: break-word;       /* Internet Explorer 5.5+ */
        }
    </style>
</head>
<body>
    <div class="container mt-4">
        <div class="card">
            <div class="card-header">
                <i class="bi bi-link-45deg"></i> <?= htmlspecialchars($page_title) ?>
            </div>
            <div class="card-body">
                <?php
                // Start output buffering
                if (ob_get_level() == 0) {
                    ob_start();
                }

                $panel_id = $_GET['id'] ?? null;

                if (!$panel_id) {
                    stream_message('danger', 'خطا', 'ID پنل مشخص نشده است.');
                    ob_end_flush();
                    exit;
                }

                stream_message('info', 'شروع تست...', 'در حال دریافت اطلاعات پنل با ID: ' . (int)$panel_id);

                // 1. Fetch panel data from DB
                try {
                    $stmt = $pdo->prepare("SELECT * FROM panels WHERE id = ?");
                    $stmt->execute([(int)$panel_id]);
                    $panel = $stmt->fetch();

                    if (!$panel) {
                        stream_message('danger', 'خطا', 'پنلی با این ID یافت نشد.');
                        ob_end_flush();
                        exit;
                    }
                    stream_message('success', 'مرحله ۱: دریافت اطلاعات از دیتابیس', 'اطلاعات پنل "' . htmlspecialchars($panel['name']) . '" با موفقیت از دیتابیس خوانده شد.');

                } catch (Exception $e) {
                    stream_message('danger', 'خطای دیتابیس', 'مشکل در خواندن اطلاعات از دیتابیس: ' . $e->getMessage());
                    ob_end_flush();
                    exit;
                }
                
                // 2. Prepare API connection
                $url = $panel['url'];
                $username = $panel['username'];
                $password = $panel['password']; // Password is now fetched from DB

                // Prepare proxy config from DB data
                $proxy_config = null;
                if (!empty($panel['proxy_host']) && !empty($panel['proxy_port'])) {
                    stream_message('info', 'مرحله ۲: آماده‌سازی اتصال', 'تنظیمات پروکسی شناسایی شد. اتصال از طریق پروکسی انجام خواهد شد.');
                    $proxy_config = [
                        'type' => $panel['proxy_type'],
                        'host' => $panel['proxy_host'],
                        'port' => $panel['proxy_port'],
                        'username' => $panel['proxy_username'],
                        'password' => $panel['proxy_password'],
                        'use_on_error' => (bool)$panel['use_proxy']
                    ];
                } else {
                    stream_message('info', 'مرحله ۲: آماده‌سازی اتصال', 'اتصال مستقیم (بدون پروکسی) برقرار خواهد شد.');
                }

                // 3. Test Connection (Instantiate XrayAPI)
                try {
                    stream_message('info', 'مرحله ۳: تست لاگین', 'در حال تلاش برای ورود به پنل...');
                    $xrayAPI = new XrayAPI($url, $username, $password, $proxy_config);
                    stream_message('success', 'مرحله ۳: تست لاگین موفق', 'لاگین با موفقیت انجام شد. کوکی و توکن دریافت شد.');
                    
                    // 4. Test getSystemStats
                    try {
                        stream_message('info', 'مرحله ۴: دریافت آمار سیستم', 'در حال تلاش برای دریافت آمار کلی سیستم (CPU, RAM)...');
                        $stats = $xrayAPI->getSystemStats();
                        stream_message('success', 'مرحله ۴: دریافت آمار موفق',
                            "CPU: {$stats['cpu']}% | RAM: {$stats['mem']['current']}/{$stats['mem']['total']} ({$stats['mem']['percentage']}%)" .
                            "\nUptime: {$stats['uptime']} | Traffic (Up/Down): {$stats['traffic']['sent']}/{$stats['traffic']['recv']}"
                        );
                    } catch (Exception $e) {
                        stream_message('danger', 'مرحله ۴: دریافت آمار ناموفق', $e->getMessage());
                    }

                    // 5. Test getInbounds
                    try {
                        stream_message('info', 'مرحله ۵: دریافت لیست اینباندها', 'در حال تلاش برای دریافت لیست اینباندها...');
                        $inbounds = $xrayAPI->getInbounds();
                        $inbound_list = $inbounds['obj'] ?? ($inbounds['data'] ?? ($inbounds ?? []));
                        $count = count($inbound_list);
                        stream_message('success', 'مرحله ۵: دریافت اینباندها موفق', 'تعداد ' . $count . ' اینباند دریافت شد.');
                        if ($count > 0) {
                            echo "<h6>نمونه اولین اینباند:</h6>";
                            echo "<pre>" . json_encode($inbound_list[0], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "</pre>";
                            ob_flush();
                            flush();
                        }

                    } catch (Exception $e) {
                        stream_message('danger', 'مرحله ۵: دریافت اینباندها ناموفق', $e->getMessage());
                    }

                } catch (Exception $e) {
                    stream_message('danger', 'مرحله ۳: تست لاگین ناموفق', 'اتصال به پنل با خطا مواجه شد: ' . $e->getMessage());
                    echo "<p class=\"mt-3\"><strong>راهنمایی برای رفع مشکل:</strong></p>";
                    echo "<ul>";
                    echo "<li>مطمئن شوید آدرس پنل، نام کاربری و رمز عبور در صفحه مدیریت پنل‌ها صحیح باشد.</li>";
                    echo "<li>بررسی کنید آیا سرور شما (<code>" . ($_SERVER['SERVER_ADDR'] ?? 'IP سرور شما') . "</code>) به آدرس پنل (<code>" . htmlspecialchars($url) . "</code>) دسترسی شبکه دارد.</li>";
                    echo "<li>فایروال سرور پنل یا سرور شما ممکن است اتصال را مسدود کرده باشد.</li>";
                    echo "<li>اگر پنل شما پشت Cloudflare است، تنظیمات امنیتی آن را بررسی کنید.</li>";
                    echo "<li>گزارش‌های فایل <code>api/api_debug.log</code> را برای جزئیات فنی بیشتر بررسی کنید.</li>";
                    echo "</ul>";
                }

                // End buffering and output everything
                ob_end_flush();
                ?>
            </div>
            <div class="card-footer text-center">
                <a href="admin/panels.php" class="btn btn-secondary"><i class="bi bi-arrow-right"></i> بازگشت به لیست پنل‌ها</a>
            </div>
        </div>
    </div>
</body>
</html>
