<?php
// --- جلوگیری از بسته شدن اسکریپت ---
ignore_user_abort(true);
set_time_limit(0);
header("X-LiteSpeed-ignore-user-abort: true"); 

if (ob_get_level()) ob_end_clean();
header("Connection: close");
ob_start();
echo "Background Process Started.";
header("Content-Length: " . ob_get_length());
ob_end_flush();
@ob_flush();
@flush();

if (function_exists('fastcgi_finish_request')) {
    fastcgi_finish_request();
}
// ------------------------------------------------------------------

require_once __DIR__ . "/../herbasc/config.php";
require_once __DIR__ . "/../database.php";

if(empty($_POST['secret']) || $_POST['secret'] !== SECRET_KEY){
    exit("Access Denied!");
}

$msgId = $_POST['text'] ?? null;
$chatId = $_POST['where'] ?? null; 
$type = $_POST['chat'] ?? 'all';
$sendMethod = $_POST['method'] ?? 'copy';

if (!$msgId || !$chatId) {
    exit("Missing parameters.");
}

function bot($method, $datas = []){
    $url = "https://api.telegram.org/bot" . TOKEN . "/" . $method;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
    // تشخیص اینکه آیا داریم فایل (CURLFile) میفرستیم یا فقط دیتای معمولی
    $hasFile = false;
    foreach ($datas as $data) {
        if ($data instanceof CURLFile) {
            $hasFile = true;
            break;
        }
    }
    
    if ($hasFile) {
        curl_setopt($ch, CURLOPT_POSTFIELDS, $datas);
    } else {
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($datas));
    }

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $res = curl_exec($ch);
    curl_close($ch);
    return json_decode($res, true);
}

$targets = [];

if ($type === "user" || $type === "all") {
    $stmt = $db->query("SELECT id FROM users");
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        $targets[] = $row['id'];
    }
}
if ($type === "group" || $type === "all") {
    $stmt = $db->query("SELECT id FROM groups");
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        $targets[] = $row['id'];
    }
}

$targets = array_unique($targets);

if(empty($targets)){
    bot('sendMessage', [
        'chat_id' => $chatId,
        'text' => "⚠️ هیچ هدفی در دیتابیس برای ارسال یافت نشد!"
    ]);
    exit();
}

$methodName = ($sendMethod === 'fwd') ? "فوروارد" : "کپی";
$apiMethod = ($sendMethod === 'fwd') ? 'forwardMessage' : 'copyMessage';

bot('sendMessage', [
    'chat_id' => $chatId,
    'text' => "🚀 عملیات $methodName همگانی با سیستم پردازش امن شروع شد...\n🎯 تعداد هدف: " . count($targets) . "\n\n(لطفاً چند ثانیه صبور باشید...)"
]);

$success = 0;
$fail = 0;
$deleted_users = 0;
$failed_logs = "گزارش خطاهای ارسال همگانی\nتاریخ: " . date('Y-m-d H:i:s') . "\n------------------------\n";

// دسته‌های ۱۰ تایی برای جلوگیری از بلاک شدن توسط فایروال هاست (CPU Safe)
$chunks = array_chunk($targets, 10);

foreach ($chunks as $chunk) {
    $mh = curl_multi_init();
    $handles = [];

    foreach ($chunk as $targetId) {
        $ch = curl_init();
        $url = "https://api.telegram.org/bot" . TOKEN . "/" . $apiMethod;
        $datas = [
            'chat_id' => $targetId,
            'from_chat_id' => $chatId,
            'message_id' => $msgId
        ];
        
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($datas));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 10);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        
        curl_multi_add_handle($mh, $ch);
        $handles[$targetId] = $ch;
    }

    $running = null;
    do {
        $status = curl_multi_exec($mh, $running);
        if ($running) {
            // استراحت بسیار کوتاه برای جلوگیری از قفل شدن پردازنده سرور
            curl_multi_select($mh, 0.5); 
        }
    } while ($running > 0 && $status == CURLM_OK);

    foreach ($handles as $targetId => $ch) {
        $res = curl_multi_getcontent($ch);
        $decoded = json_decode($res, true);
        
        if (isset($decoded['ok']) && $decoded['ok']) {
            $success++;
        } else {
            $fail++;
            $desc = $decoded['description'] ?? 'Unknown Error';
            $errCode = $decoded['error_code'] ?? 0;
            $failed_logs .= "ID: $targetId | Error [$errCode]: $desc\n";
            
            if ($errCode == 403 || strpos(strtolower($desc), 'deactivated') !== false || strpos(strtolower($desc), 'chat not found') !== false) {
                try {
                    $db->prepare("DELETE FROM users WHERE id = :id")->execute([':id' => $targetId]);
                    $db->prepare("DELETE FROM groups WHERE id = :id")->execute([':id' => $targetId]);
                    $deleted_users++;
                } catch (Throwable $e) {}
            }
        }
        curl_multi_remove_handle($mh, $ch);
        curl_close($ch);
    }
    curl_multi_close($mh);
    
    usleep(150000); 
}

$report = "📊 <b>گزارش نهایی $methodName همگانی:</b>\n\n";
$report .= "✅ ارسال موفق: <code>$success</code>\n";
$report .= "❌ ارسال ناموفق: <code>$fail</code>\n";
$report .= "🗑 اکانت‌های مسدود/حذف شده: <code>$deleted_users</code>\n";

if ($fail > 0) {
    $log_path = __DIR__ . "/report_" . time() . ".txt";
    file_put_contents($log_path, $failed_logs);
    
    $sendReport = bot('sendDocument', [
        'chat_id' => $chatId,
        'document' => new CURLFile($log_path),
        'caption' => $report,
        'parse_mode' => 'HTML'
    ]);
    
    // اگر ارسال فایل متنی با ارور مواجه شد، حداقل تکست گزارش را به ادمین تحویل بده
    if (!isset($sendReport['ok']) || !$sendReport['ok']) {
        bot('sendMessage', [
            'chat_id' => $chatId,
            'text' => $report . "\n\n⚠️ <i>(فایل متنیِ خطاها به دلیل محدودیت آپلود ارسال نشد، اما عملیات با موفقیت به پایان رسید)</i>",
            'parse_mode' => 'HTML'
        ]);
    }
    
    @unlink($log_path); 
} else {
    bot('sendMessage', [
        'chat_id' => $chatId,
        'text' => $report,
        'parse_mode' => 'HTML'
    ]);
}

file_put_contents(__DIR__ . "/debug_step.txt", "گزارش نهایی تولید شد. موفق: $success ، خطا: $fail");

?>