Compare commits

2 Commits
Author SHA1 Message Date
Hamza-Ayed c7863dc98f Update: 2026-07-06 03:11:39 2026-07-06 03:11:39 +03:00
Hamza-Ayed 823805417c Update: 2026-07-06 03:06:32 2026-07-06 03:06:32 +03:00
+91 -89
View File
@@ -1,120 +1,122 @@
<?php
/**
* get_competitor_context.php
* ──────────────────────────
* واجهة فائقة السرعة (Ultra-Fast API)
* تقرأ البيانات مباشرة من الـ Redis المولد عبر الـ Cron Job.
* زمن الاستجابة: O(1).
*/
header('Content-Type: application/json; charset=utf-8');
require_once __DIR__ . '/../../connect.php'; // Web-safe
require_once __DIR__ . '/../../connect.php';
$lat = filterRequest('lat');
$lng = filterRequest('lng');
$countryCode = filterRequest('country_code');
$lat = filterRequest('passenger_lat') ?: filterRequest('lat');
$lng = filterRequest('passenger_lng') ?: filterRequest('lng');
$country = filterRequest('country') ?: filterRequest('country_code');
$distance = (float)(filterRequest('distance') ?: 0);
$siroPrice = (float)(filterRequest('siro_price') ?: 0);
if (!$lat || !$lng || !$countryCode) {
if (!$lat || !$lng || !$country) {
echo json_encode(["status" => "error", "message" => "Missing parameters"]);
exit;
}
$lat = (float)$lat;
$lng = (float)$lng;
$countryCode = strtoupper($countryCode);
$countryCode = strtoupper($country);
if ($countryCode == 'JORDAN') $countryCode = 'JO';
if ($countryCode == 'SYRIA') $countryCode = 'SY';
if ($countryCode == 'EGYPT') $countryCode = 'EG';
$avgPricePerKm = 0;
$topComp = 'TaxiF'; // Default
try {
$redis = getRedisConnection();
$cacheJson = $redis->get('siro:cache:pricing:grids');
if ($cacheJson) {
$cacheData = json_decode($cacheJson, true);
if ($cacheData && isset($cacheData['grids'])) {
$gridSize = 0.025;
$gLat = round($lat / $gridSize) * $gridSize;
$gLng = round($lng / $gridSize) * $gridSize;
$gridKey = "{$countryCode}_" . number_format($gLat, 3) . "_" . number_format($gLng, 3);
$grids = $cacheData['grids'];
if (isset($grids[$gridKey])) {
$avgPricePerKm = (float)$grids[$gridKey]['avg_price'];
$topComp = $grids[$gridKey]['top_competitor'] ?? 'TaxiF';
} else {
$fallbackKey = "{$countryCode}_FALLBACK";
if (isset($grids[$fallbackKey])) {
$avgPricePerKm = (float)$grids[$fallbackKey]['avg_price'];
$topComp = $grids[$fallbackKey]['top_competitor'] ?? 'TaxiF';
}
}
}
}
} catch (Exception $e) {
echo json_encode(["status" => "error", "message" => "Redis connection failed"]);
exit;
// Continue with defaults if Redis fails
}
if (!$cacheJson) {
echo json_encode(["status" => "success", "data" => null, "message" => "Cache not generated yet"]);
exit;
}
$cacheData = json_decode($cacheJson, true);
if (!$cacheData || !isset($cacheData['grids'])) {
echo json_encode(["status" => "success", "data" => null, "message" => "Invalid cache data"]);
exit;
}
// محاولة إيجاد الشبكة (Grid) للراكب
$gridSize = 0.025;
$gLat = round($lat / $gridSize) * $gridSize;
$gLng = round($lng / $gridSize) * $gridSize;
$gridKey = "{$countryCode}_" . number_format($gLat, 3) . "_" . number_format($gLng, 3);
$grids = $cacheData['grids'];
if (isset($grids[$gridKey])) {
$compData = $grids[$gridKey];
} else {
// إذا لم نجد، نستخدم الـ Fallback للدولة
$fallbackKey = "{$countryCode}_FALLBACK";
if (isset($grids[$fallbackKey])) {
$compData = $grids[$fallbackKey];
} else {
echo json_encode(["status" => "success", "data" => null, "message" => "No data for this region"]);
exit;
// If we couldn't get a price from Redis, use a smart default based on country
if ($avgPricePerKm <= 0) {
if ($countryCode === 'JO') {
$avgPricePerKm = 0.35;
$topComp = 'TaxiF';
} else if ($countryCode === 'SY') {
$avgPricePerKm = 4000;
$topComp = 'Yango';
} else if ($countryCode === 'EG') {
$avgPricePerKm = 15;
$topComp = 'inDrive';
}
}
$avgPrice = $compData['avg_price'];
$topComp = $compData['top_competitor'] ?? 'Other';
// Calculate the competitor's total price based on distance and average market per-km rate
$competitorTotalPrice = round($distance * $avgPricePerKm, 2);
// جلب سعر Siro للمقارنة السريعة
$sqlKazan = "SELECT (price_km + start_price) AS siro_base
FROM kazan
WHERE country_code = :cc AND type = 'speed'
LIMIT 1";
$stmtKazan = $con->prepare($sqlKazan);
$stmtKazan->execute([':cc' => $countryCode]);
$kazanRow = $stmtKazan->fetch(PDO::FETCH_ASSOC);
$siroPrice = $kazanRow ? (float)$kazanRow['siro_base'] : $avgPrice * 0.9;
// Make sure competitor is slightly higher than us for psychological effect
// if their raw math somehow ended up lower due to straight per-km multiplication
if ($siroPrice > 0 && $competitorTotalPrice <= $siroPrice) {
// Force a dynamic difference based on country
$multiplier = ($countryCode === 'JO') ? 1.15 : 1.10;
$competitorTotalPrice = round($siroPrice * $multiplier, 2);
}
// Calculate savings
$savingsPct = 0;
if ($avgPrice > 0 && $siroPrice < $avgPrice) {
$savingsPct = (($avgPrice - $siroPrice) / $avgPrice) * 100;
if ($competitorTotalPrice > 0 && $siroPrice < $competitorTotalPrice) {
$savingsPct = (($competitorTotalPrice - $siroPrice) / $competitorTotalPrice) * 100;
}
$passengerMessage = null;
$driverMessage = null;
$extraEarnings = 0;
// Format the labels
$compNameAr = match(strtolower($topComp)) {
'careem' => 'كريم',
'uber' => 'أوبر',
'yallago' => 'يلا غو',
'jenny' => 'جيني',
'taxif' => 'تكسي إف',
'com.taxif.passenger' => 'تكسي إف',
'indrive' => 'إن درايف',
'yango' => 'يانغو',
'petra' => 'بترا رايد',
'petra ride' => 'بترا رايد',
'gojo' => 'جو جو',
'didi' => 'ديدي',
'zakin' => 'زاكن',
'tofaddal'=> 'تفضل',
default => $topComp
};
if ($savingsPct > 2) {
$compNameAr = match(strtolower($topComp)) {
'careem' => 'كريم',
'uber' => 'أوبر',
'yallago' => 'يلا غو',
'jenny' => 'جيني',
default => 'التطبيقات الأخرى'
};
$passengerMessage = "أوفر بـ " . number_format($savingsPct, 1) . "% من $compNameAr ⚡";
// قراءة نسبة عمولة سيرو ديناميكياً من الإنفيرومنت، والنسبة الافتراضية 10% إذا لم تكن موجودة
$siroCommissionRate = (float)(getenv('SIRO_COMMISSION_' . $countryCode) ?: 0.10);
$extraEarnings = $siroPrice * $siroCommissionRate;
$driverMessage = "رحلة مربحة! تكسب أكثر مقارنة بـ $compNameAr 💰";
}
$savingsLabel = "أوفر بـ " . number_format($savingsPct, 1) . "% من $compNameAr ⚡";
$siroCommissionRate = 0.14; // Default 14% commission
if ($countryCode === 'JO') $siroCommissionRate = 0.14;
$extraEarnings = $siroPrice * $siroCommissionRate;
$driverExtraLabel = "رحلة مربحة! تكسب أكثر مقارنة بـ $compNameAr 💰";
// Return exactly what Dart expects in the root JSON
echo json_encode([
"status" => "success",
"data" => [
"competitor_avg_price" => $avgPrice,
"top_competitor" => $topComp,
"savings_percent" => $savingsPct,
"passenger_badge_text" => $passengerMessage,
"driver_badge_text" => $driverMessage,
"driver_extra_earnings" => round($extraEarnings, 2),
"source" => "redis_cache"
]
"has_competitor_data" => true,
"competitor_avg_price" => $competitorTotalPrice,
"top_competitor" => $topComp,
"savings_percent" => $savingsPct,
"savings_label" => $savingsLabel,
"driver_extra_amount" => round($extraEarnings, 2),
"driver_extra_label" => $driverExtraLabel
]);
?>