<?php
// modules/guardian/core/engine.php

// فراخوانی فایل‌های تنظیمات و API
require_once __DIR__ . '/../../../config/db.php';
require_once __DIR__ . '/../../pasarguard/pasarguard_api.php'; 

// 🔥 این خط کلیدی قفل سشن را آزاد می‌کند تا سایر صفحات پنل هنگام باز بودن این صفحه هنگ نکنند!
if (session_status() === PHP_SESSION_ACTIVE) { 
    session_write_close(); 
}

// تنظیمات هدر برای نمایش زنده و خط‌به‌خط لاگ‌ها در مرورگر (بدون کش)
header('Content-Type: text/html; charset=utf-8');
header('Cache-Control: no-cache');
@ini_set('output_buffering', 'off');
@ini_set('zlib.output_compression', false);

echo "<div style='background:#1e293b; color:#10b981; font-family:monospace; padding:20px; border-radius:10px; margin:20px;' dir='ltr'>";
echo "<h3>🛡️ Guardian Engine Started (Direct API Mode)</h3><hr style='border-color:#334155'>";

// حلقه 6 تایی برای پر کردن زمان 1 دقیقه (هر چرخه حدود 10 ثانیه)
for ($i = 0; $i < 6; $i++) {
    // 1. بررسی وضعیت دکمه خاموش/روشن از دیتابیس
    $status = $pdo->query("SELECT setting_value FROM global_settings WHERE setting_key = 'guardian_status'")->fetchColumn();
    $time = date('H:i:s');

    if ($status !== '1') {
        echo "<p style='color:#ef4444;'>[{$time}] Cycle " . ($i+1) . "/6: System is Paused. Skipping...</p>";
        @ob_flush(); flush();
        sleep(10);
        continue;
    }

    echo "<p style='color:#3b82f6;'>[{$time}] Cycle " . ($i+1) . "/6: Scanning Pasarguard Network...</p>";
    @ob_flush(); flush();

    // 2. دریافت توکن سرور اصلی پاسارگارد (فرض بر این است که آیدی سرور 1 است)
    $serverId = 1; 
    $tokenRes = getPsgApiToken($serverId);

    if (!$tokenRes || !$tokenRes['success']) {
        echo "<p style='color:#fbbf24;'>[{$time}] ⚠️ Connection Error: Failed to get API token!</p>";
        @ob_flush(); flush();
        sleep(10);
        continue;
    }

    // 3. دریافت لیست تمامی کاربران به صورت مستقیم از سرور
    $usersRes = executePsgApiCall($tokenRes['server_url'], "/api/users", "GET", null, $tokenRes['token']);
    
    $usersList = [];
    if (is_array($usersRes)) {
        // بسته به خروجی API پاسارگارد، لیست ممکن است مستقیم یا داخل کلید users باشد
        $usersList = isset($usersRes['users']) ? $usersRes['users'] : (isset($usersRes[0]) ? $usersRes : []);
    }

    $caughtCount = 0;

    // 4. اسکن تهاجمی تک‌تک کاربران برای یافتن مصرف بیش از حد
    foreach ($usersList as $u) {
        // در API مرزبان/پاسارگارد حجم‌ها بر حسب بایت (Bytes) هستند
        $dataLimit = isset($u['data_limit']) ? (float)$u['data_limit'] : 0;
        $usedTraffic = isset($u['used_traffic']) ? (float)$u['used_traffic'] : 0;
        $userStatus = $u['status'] ?? '';

        // اگر کاربر اکتیو است و محدودیت حجمی برایش تعریف شده (0 یعنی نامحدود)
        if ($userStatus === 'active' && $dataLimit > 0) {
            
            // 🔥 شکار! بررسی عبور مصرف از حد مجاز
            if ($usedTraffic >= $dataLimit) {
                
                // آماده‌سازی دستور لیمیت کردن اکانت
                $updatePayload = json_encode(['status' => 'limited']);
                
                // ارسال دستور به پاسارگارد
                $updateRes = executePsgApiCall($tokenRes['server_url'], "/api/user/" . urlencode($u['username']), "PUT", $updatePayload, $tokenRes['token']);

                // بررسی موفقیت‌آمیز بودن عملیات محدودسازی
                if (is_array($updateRes) && !isset($updateRes['error'])) {
                    
                    // تبدیل بایت به گیگابایت برای ذخیره در دیتابیس پنل
                    $limitGB = round($dataLimit / 1073741824, 2);
                    $usedGB = round($usedTraffic / 1073741824, 2);

                    // ثبت تخلف در دیتابیس Guardian تا در رادار داشبورد نمایش داده شود
                    $stmt = $pdo->prepare("INSERT INTO guardian_logs (username, volume_limit, volume_used, action_taken) VALUES (?, ?, ?, 'limited')");
                    $stmt->execute([$u['username'], $limitGB, $usedGB]);

                    echo "<p style='color:#10b981;'>&nbsp;&nbsp;🎯 <b>CAUGHT!</b> User <b>{$u['username']}</b> limited at {$usedGB}GB</p>";
                    @ob_flush(); flush();
                    
                    $caughtCount++;
                }
            }
        }
    }

    // اگر هیچ کاربری متخلف نبود
    if ($caughtCount === 0) {
        echo "<p style='color:#94a3b8;'>&nbsp;&nbsp;✔️ Network secure. No overshoots detected.</p>";
        @ob_flush(); flush();
    }

    // وقفه 10 ثانیه‌ای برای شروع اسکن بعدی در حلقه
    sleep(10);
}

echo "<hr style='border-color:#334155'><h3>✅ Guardian Engine Cycle Completed.</h3></div>";
?>