<?php
// تنظیمات نمایش خطا (برای اطمینان)
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// بررسی وجود توابع قبل از اجرا (برای رفع ارور Fatal در سرورهای محدود)
if (function_exists('ignore_user_abort')) {
    ignore_user_abort(true);
}
if (function_exists('set_time_limit')) {
    set_time_limit(120);
}

date_default_timezone_set('Asia/Tehran');

// =========================================================
// تنظیم مسیرها (بازگشت به پوشه اصلی botliza)
// =========================================================
$currentDir = __DIR__;
$parentDir = dirname(__DIR__); // مسیر پوشه botliza

if (is_dir($parentDir)) {
    chdir($parentDir);
} else {
    die("Error: Parent directory not found.");
}

$functionFile = 'function.php'; 

if (!file_exists($functionFile)) {
    die("Critical Error: function.php not found in " . getcwd());
}

// تعریف متغیر وضعیت لود شدن (رفع وارنینگ)
$bootstrapLoaded = false;

try {
    require_once $functionFile;
    $bootstrapLoaded = true; // اگر موفق بود، مقدارش true می‌شود
} catch (Throwable $e) {
    echo "Error loading function.php: " . $e->getMessage();
}

// =========================================================
// تنظیم آدرس‌دهی URL
// =========================================================
$siteDomain = 'tasmino.ir';
$mainFolder = 'botliza';
$botFolder  = 'cronbot'; 

$baseUrl = "https://{$siteDomain}/{$mainFolder}/{$botFolder}/";

// بستن اتصالات اضافه دیتابیس
if (isset($conn) && $conn instanceof mysqli) { try { $conn->close(); } catch (Throwable $e) {} }
if (isset($mysqli) && $mysqli instanceof mysqli) { try { $mysqli->close(); } catch (Throwable $e) {} }
if (isset($db) && $db instanceof PDO) { $db = null; }

// تابع ساخت آدرس
$buildCronUrl = static function (string $script) use ($baseUrl): string {
    $script = ltrim($script, '/');
    return $baseUrl . $script;
};

// تابع اجرا کننده و لاگ ساز
function callEndpoint(string $url): void
{
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_CONNECTTIMEOUT => 5,
        CURLOPT_TIMEOUT        => 30,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_FORBID_REUSE   => true,
    ]);
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $curlError = curl_error($ch);
    curl_close($ch);
    
    // --- لاگ جیسون ---
    global $currentDir; 
    $logFile = $currentDir . '/cron-log.json';
    
    $newEntry = [
        'time' => date('Y-m-d H:i:s'),
        'url' => $url,
        'status' => $httpCode,
        'result_preview' => substr($response, 0, 50),
        'error' => $curlError ? $curlError : null
    ];

    $currentData = [];
    if (file_exists($logFile)) {
        $json = file_get_contents($logFile);
        $decoded = json_decode($json, true);
        if (is_array($decoded)) $currentData = $decoded;
    }

    array_unshift($currentData, $newEntry);
    $currentData = array_slice($currentData, 0, 50); 
    file_put_contents($logFile, json_encode($currentData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
    
    sleep(1);
}

// محاسبات زمان
$now       = time();
$minute    = (int) date('i', $now);
$hour      = (int) date('G', $now);
$dayOfYear = (int) date('z', $now);

if (!defined('APP_ROOT_PATH')) {
    define('APP_ROOT_PATH', getcwd());
}

$pdo = getDatabaseConnection();
$runtimeState = [];

if ($pdo instanceof PDO) {
    if (function_exists('ensureCronRuntimeStateTable')) ensureCronRuntimeStateTable($pdo);
    if (function_exists('loadCronRuntimeState')) $runtimeState = loadCronRuntimeState($pdo);
}

$getIntervalSeconds = static function (array $schedule): int {
    $unit  = isset($schedule['unit']) ? strtolower((string) $schedule['unit']) : 'minute';
    $value = isset($schedule['value']) ? (int) $schedule['value'] : 1;
    if ($value < 1) $value = 1;

    switch ($unit) {
        case 'minute':   return 0;
        case 'hour':     return $value * 3600;
        case 'day':      return $value * 86400;
        case 'disabled': return 0;
        default:         return 0;
    }
};

// اجرای هوشمند طبق دیتابیس
if ($bootstrapLoaded && function_exists('getCronJobDefinitions') && function_exists('shouldRunCronJob')) {
    $definitions = getCronJobDefinitions();
    $schedules   = function_exists('loadCronSchedules') ? loadCronSchedules() : [];
    
    foreach ($definitions as $key => $definition) {
        if (empty($definition['script'])) continue;

        $defaultConfig = $definition['default'] ?? ['unit' => 'minute', 'value' => 1];
        $schedule      = $schedules[$key] ?? $defaultConfig;
        $unit          = strtolower($schedule['unit'] ?? 'minute');

        if ($unit === 'disabled') continue;

        if ($unit === 'minute') {
            if (!shouldRunCronJob($schedule, $minute, $hour, $dayOfYear)) continue;
            callEndpoint($buildCronUrl($definition['script']));
            continue;
        }

        $intervalSeconds = $getIntervalSeconds($schedule);
        if ($intervalSeconds <= 0) continue;

        $lastRun = isset($runtimeState[$key]) ? (int) $runtimeState[$key] : 0;
        if (($now - $lastRun) < $intervalSeconds) continue;

        callEndpoint($buildCronUrl($definition['script']));
        $runtimeState[$key] = $now;
        if ($pdo instanceof PDO) {
            setCronJobLastRun($pdo, $key, $now);
        }
    }
    
    // اجرای اسکریپت‌های اجباری
    $extraScripts = ['index.php', 'lottery.php'];
    $definedScripts = [];
    foreach ($definitions as $definition) {
        if (isset($definition['script'])) $definedScripts[] = ltrim($definition['script'], '/');
    }
    foreach ($extraScripts as $extraScript) {
        if (!in_array($extraScript, $definedScripts, true)) {
            callEndpoint($buildCronUrl($extraScript));
        }
    }

} else {
    // حالت اضطراری (وقتی دیتابیس کار نمی‌دهد)
    $everyMinute = [
        'croncard.php', 'NoticationsService.php', 'sendmessage.php',
        'activeconfig.php', 'disableconfig.php', 'iranpay1.php',
        'index.php', 'lottery.php',
    ];
    
    foreach ($everyMinute as $script) {
        callEndpoint($buildCronUrl($script));
    }
    
    if ($minute % 2 === 0) {
        foreach (['gift.php', 'configtest.php'] as $script) callEndpoint($buildCronUrl($script));
    }
    if ($minute % 3 === 0) callEndpoint($buildCronUrl('plisio.php'));
    if ($minute % 5 === 0) callEndpoint($buildCronUrl('payment_expire.php'));
    if ($minute % 15 === 0) {
        foreach (['statusday.php', 'on_hold.php', 'uptime_node.php', 'uptime_panel.php'] as $script) callEndpoint($buildCronUrl($script));
    }
    if ($minute % 30 === 0) callEndpoint($buildCronUrl('expireagent.php'));
    if ($minute === 0 && $hour % 5 === 0) callEndpoint($buildCronUrl('backupbot.php'));
}

echo "OK - Cron Executed Successfully. Check cron-log.json";
?>