<?php
include_once __DIR__ . '/db/koneksi.php';
include_once __DIR__ . '/api/nexus.php'; 
include_once __DIR__ . '/api/sgx.php';

// Deteksi apakah request datang dari AJAX browser atau include file PHP biasa
$is_ajax_request = (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') || (isset($_GET['format']) && $_GET['format'] === 'json');

if ($is_ajax_request) {
    header('Content-Type: application/json; charset=utf-8');
}

error_reporting(E_ALL);
ini_set('display_errors', 1);

if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

$logFile = __DIR__ . '/api_result.log';
if (!function_exists('writeLog')) {
    function writeLog($msg, $file) {
        $time = date("Y-m-d H:i:s");
        file_put_contents($file, "[$time] $msg\n", FILE_APPEND);
    }
}

$nama_pengguna = $_SESSION['username'] ?? null;
$ext = $_SESSION['extplayer'] ?? null;
$saldo_cadangan = isset($_SESSION['saldo']) ? (float)$_SESSION['saldo'] : 0;

if (!$nama_pengguna) {
    if ($is_ajax_request) {
        echo json_encode(['ok' => false, 'message' => 'Belum login', 'balance' => 0, 'formatted' => 'IDR 0'], JSON_UNESCAPED_UNICODE);
        exit;
    }
    return; // Lewati jika dipanggil sebagai include biasa
}

try {
    // 1. AMBIL DATA SALDO DARI API NEXUS
    $nexusRaw = $nx->info_member($ext);
    $nexus = json_decode($nexusRaw);
    
    // Fallback proteksi jika API Nexus timeout / tidak merespon
    if (!isset($nexus->status) || $nexus->status != 1) {
        writeLog("NEXUS API ERROR / TIMEOUT pada user [$nama_pengguna]", $logFile);
        $saldo_nexus = $saldo_cadangan;
    } else {
        $saldo_nexus = (float)($nexus->user->balance ?? $nexus->balance ?? 0);
    }

    // 2. AMBIL DATA SALDO DARI API SGX
    $sgxRaw = $SGX->info_member($ext);
    $sgx = json_decode($sgxRaw);
    
    // Fallback proteksi jika API SGX timeout / tidak merespon
    if (!isset($sgx->status) || $sgx->status != 200) {
        writeLog("SGX API ERROR / TIMEOUT pada user [$nama_pengguna]", $logFile);
        $saldo_sgx = $saldo_cadangan;
    } else {
        $saldo_sgx = (float)($sgx->data->balance ?? $sgx->balance ?? 0);
    }

    // 3. AMBIL DATA HISTORI SALDO TERAKHIR DARI DATABASE LOKAL
    $stmt = $koneksi->prepare("SELECT saldo_nexus, saldo_sgx FROM tb_user WHERE username = ?");
    $stmt->bind_param("s", $nama_pengguna);
    $stmt->execute();
    $res = $stmt->get_result()->fetch_assoc();
    $stmt->close();

    $last_telo = isset($res['saldo_nexus']) ? (float)$res['saldo_nexus'] : $saldo_nexus;
    $last_sgx  = isset($res['saldo_sgx']) ? (float)$res['saldo_sgx'] : $saldo_sgx;

    $delta_telo = $saldo_nexus - $last_telo;
    $delta_sgx  = $saldo_sgx - $last_sgx;

    $finalBalance = $saldo_nexus; 
    
    // 4. LOGIKA SINKRONISASI SALDO ANTAR PROVIDER GAME
    if (abs($delta_telo) > 0 && abs($delta_telo) >= abs($delta_sgx)) {
        $finalBalance = $saldo_nexus;
        if ($saldo_nexus > $saldo_sgx) {
            $diff = $saldo_nexus - $saldo_sgx;
            $SGX->deposit_member($ext, $diff);
        } elseif ($saldo_nexus < $saldo_sgx) {
            $diff = $saldo_sgx - $saldo_nexus;
            $SGX->withdraw_member($ext, $diff);
        }
    } elseif (abs($delta_sgx) > 0 && abs($delta_sgx) > abs($delta_telo)) {
        $finalBalance = $saldo_sgx;
        if ($saldo_sgx > $saldo_nexus) {
            $diff = $saldo_sgx - $saldo_nexus;
            $nx->deposit_member($ext, $diff);
        } elseif ($saldo_sgx < $saldo_nexus) {
            $diff = $saldo_nexus - $saldo_sgx;
            $nx->withdraw_member($ext, $diff);
        }
    } else {
        $finalBalance = $saldo_nexus;
        if ($saldo_nexus != $saldo_sgx) {
            $finalBalance = max($saldo_nexus, $saldo_sgx);
        }
    }

    // 5. UPDATE TERBARU SALDO AKTIF KE TB_USER
    $update = $koneksi->prepare("UPDATE tb_user SET saldo_nexus = ?, saldo_sgx = ?, saldo = ? WHERE username = ?");
    $update->bind_param("ddds", $finalBalance, $finalBalance, $finalBalance, $nama_pengguna);
    $update->execute();
    $update->close();

    // Perbarui variabel global session situs agar nominal menu ikut berubah
    $_SESSION['saldo'] = $finalBalance;

    // Jika dipanggil via AJAX, muntahkan respon JSON
    if ($is_ajax_request) {
        echo json_encode([
            'ok' => true,
            'balance' => $finalBalance,
            'formatted' => 'IDR ' . number_format($finalBalance, 0, ',', '.')
        ], JSON_UNESCAPED_UNICODE);
        exit;
    }

} catch (Exception $e) {
    writeLog("SYNC CRITICAL ERROR: " . $e->getMessage(), $logFile);
    if ($is_ajax_request) {
        echo json_encode([
            'ok' => false,
            'message' => 'Terjadi kesalahan sistem internal',
            'balance' => $saldo_cadangan,
            'formatted' => 'IDR ' . number_format($saldo_cadangan, 0, ',', '.')
        ], JSON_UNESCAPED_UNICODE);
        exit;
    }
}
?>