<?php
/**
 * SUPER DAEMON CRON JOB FOR WINGO 30S
 * - Fixed: Race condition eliminated by updating is_settled last.
 * - Fixed: Quantity (bet_multiple) added to loss amount calculation.
 */
require_once __DIR__ . '/../config/db.php';
header('Content-Type: text/plain; charset=utf-8');
date_default_timezone_set("Asia/Kolkata");
set_time_limit(60);

$gameCode = 'WinGo_30S';
$cronStartTime = time();
$maxRunTime = 55; 

echo "[" . date('Y-m-d H:i:s') . "] === $gameCode DAEMON STARTED ===\n";

$syncDone = false;

// UNIVERSAL WIN CHECKER
function checkWinLogic($betContent, $winningNumber) {
    $b = strtolower(trim($betContent));
    $num = (int)$winningNumber;
    $isWin = false; $multiplier = 0;

    if ($b === 'big' || $b === 'bigsmall_big') { if ($num >= 5) { $isWin = true; $multiplier = 2; } }
    elseif ($b === 'small' || $b === 'bigsmall_small') { if ($num < 5) { $isWin = true; $multiplier = 2; } }
    elseif ($b === 'green' || $b === 'color_green') { if (in_array($num,[1,3,7,9])) { $isWin = true; $multiplier = 2; } elseif ($num === 5) { $isWin = true; $multiplier = 1.5; } }
    elseif ($b === 'red' || $b === 'color_red') { if (in_array($num,[2,4,6,8])) { $isWin = true; $multiplier = 2; } elseif ($num === 0) { $isWin = true; $multiplier = 1.5; } }
    elseif ($b === 'violet' || $b === 'color_violet') { if (in_array($num,[0,5])) { $isWin = true; $multiplier = 4.5; } }
    elseif (strpos($b, 'num_') !== false) { if (str_replace('num_', '', $b) == $num) { $isWin = true; $multiplier = 9; } }
    elseif (is_numeric($b)) { if ((int)$b == $num) { $isWin = true; $multiplier = 9; } }

    return['isWin' => $isWin, 'multiplier' => $multiplier];
}

while (time() - $cronStartTime < $maxRunTime) {
    $currentTimeMs = (int)(microtime(true) * 1000);
    
    $resultMode = 'random';
    $configRes = $conn->query("SELECT result_mode FROM aks_game_settings WHERE game_code = '$gameCode' AND is_active = 1 LIMIT 1");
    if ($configRes && $configRes->num_rows > 0) $resultMode = $configRes->fetch_assoc()['result_mode'] ?: 'random';

    // Sync from API
    if (!$syncDone) {
        $ch = curl_init("https://draw.ar-lottery01.com/WinGo/WinGo_30S.json");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 2); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        $apiRes = curl_exec($ch); curl_close($ch);
        if ($apiRes) {
            $apiData = json_decode($apiRes, true);
            if (isset($apiData['next']['issueNumber'])) {
                $n = $apiData['next'];
                $conn->query("INSERT IGNORE INTO aks_game_periods (game_code, issue_number, start_time, end_time, is_settled) VALUES ('$gameCode', '{$n['issueNumber']}', {$n['startTime']}, {$n['endTime']}, 0)");
            }
        }
        $syncDone = true;
    }

    $pendingRes = $conn->query("SELECT id, issue_number, end_time FROM aks_game_periods WHERE game_code = '$gameCode' AND end_time <= $currentTimeMs AND is_settled = 0 ORDER BY end_time ASC LIMIT 1");

    if ($pendingRes && $pendingRes->num_rows > 0) {
        $period = $pendingRes->fetch_assoc();
        $periodId = $period['id']; $issueNumber = $period['issue_number']; $endTime = (int)$period['end_time'];
        $finalNumber = null; $winSource = "";

        // METHOD 1: MANUAL
        $manualRes = $conn->query("SELECT manual_result FROM aks_manual_results WHERE game_code='$gameCode' AND issue_number='$issueNumber' AND is_used=0");
        if ($manualRes && $manualRes->num_rows > 0) {
            $finalNumber = (string)$manualRes->fetch_assoc()['manual_result']; $winSource = "manual";
            $conn->query("UPDATE aks_manual_results SET is_used=1 WHERE game_code='$gameCode' AND issue_number='$issueNumber'");
        } 
        
        // METHOD 2: OFFICIAL
        if ($finalNumber === null && $resultMode === 'official') {
            $ch = curl_init("https://draw.ar-lottery01.com/WinGo/WinGo_30S/GetHistoryIssuePage.json");
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 2); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            $histRes = curl_exec($ch); curl_close($ch);
            if ($histRes) {
                $histData = json_decode($histRes, true);
                if (isset($histData['data']['list'])) {
                    foreach ($histData['data']['list'] as $row) {
                        if ($row['issueNumber'] == $issueNumber) { $finalNumber = (string)$row['number']; $winSource = "official"; break; }
                    }
                }
            }
            if ($finalNumber === null) {
                if (($currentTimeMs - $endTime) < 15000) { sleep(1); continue; } 
                else { $finalNumber = (string)rand(0, 9); $winSource = "official_fallback_random"; }
            }
        }
        
        // METHOD 3: ALGORITHM
        if ($finalNumber === null) {
            if ($resultMode === 'low_bet_win' || $resultMode === 'high_bet_win') {
                $payouts =[];
                for ($n = 0; $n <= 9; $n++) {
                    $totalPayout = 0;
                    $betRes = $conn->query("SELECT bet_content, real_amount FROM aks_bets WHERE game_code='$gameCode' AND issue_number='$issueNumber' AND state=2");
                    if ($betRes) {
                        while ($betRow = $betRes->fetch_assoc()) {
                            $winData = checkWinLogic($betRow['bet_content'], $n);
                            if ($winData['isWin']) $totalPayout += ((float)$betRow['real_amount'] * $winData['multiplier']);
                        }
                    }
                    $payouts[$n] = $totalPayout;
                }
                $finalNumber = (string)($resultMode === 'low_bet_win' ? array_search(min($payouts), $payouts) : array_search(max($payouts), $payouts));
                $winSource = $resultMode;
            } else {
                $finalNumber = (string)rand(0, 9); $winSource = "random";
            }
        }

        // ==========================================
        // 1. SETTLE WALLETS FIRST (Solves Race Condition)
        // ==========================================
        if ($finalNumber !== null) {
            $num = (int)$finalNumber;
            $color = 'red'; if ($num == 0) $color = 'red,violet'; elseif ($num == 5) $color = 'green,violet'; elseif (in_array($num, [1, 3, 7, 9])) $color = 'green';
            $size = ($num >= 5) ? 'big' : 'small';

            $betRes = $conn->query("SELECT id, user_id, bet_content, real_amount, amount, bet_multiple FROM aks_bets WHERE game_code='$gameCode' AND issue_number='$issueNumber' AND state=2");
            if ($betRes) {
                while ($row = $betRes->fetch_assoc()) {
                    $betId = $row['id']; $userId = $row['user_id']; 
                    $amt = (float)$row['real_amount'];      
                    
                    // FIXED: Now we multiply amount with quantity!
                    $totalBetAmt = (float)$row['amount'] * (int)$row['bet_multiple'];   
                    
                    $winData = checkWinLogic($row['bet_content'], $num);

                    if ($winData['isWin']) {
                        $totalReturn = round($amt * $winData['multiplier'], 2); 
                        $netProfit = $totalReturn - $totalBetAmt; 

                        $conn->query("UPDATE aks_bets SET state=1, win_lose_amount=$netProfit WHERE id=$betId");
                        $conn->query("UPDATE aks_wallets SET balance = balance + $totalReturn WHERE user_id=$userId");
                    } else {
                        $lossAmt = -$totalBetAmt; 
                        $conn->query("UPDATE aks_bets SET state=0, win_lose_amount=$lossAmt WHERE id=$betId");
                    }
                }
            }

            // ==========================================
            // 2. INSERT INTO HISTORY
            // ==========================================
            $conn->query("INSERT IGNORE INTO aks_game_results (game_code, issue_number, result_number, result_color, result_size, result_time) VALUES ('$gameCode', '$issueNumber', '$finalNumber', '$color', '$size', $currentTimeMs)");

            // ==========================================
            // 3. SET PERIOD TO SETTLED (LAST ACTION)
            // ==========================================
            $conn->query("UPDATE aks_game_periods SET result_number='$finalNumber', result_color='$color', result_sum=$num, result_type='$winSource', is_settled=1, updated_at=NOW() WHERE id=$periodId");

            echo "[$currentTimeMs] Settled Issue: $issueNumber | Num: $finalNumber | Source: $winSource\n";
        }
    }
    sleep(1);
}
echo "[" . date('Y-m-d H:i:s') . "] === DAEMON FINISHED ===\n";
?>