$start_location, ':end_location' => $end_location, ':date' => $date_formatted, ':time' => $time_formatted, ':endtime' => $endtime_formatted, ':price' => $price, ':passenger_id' => $passenger_id, ':driver_id' => $driver_id, ':status' => $status, ':carType' => $carType, ':price_for_driver' => $price_for_driver, ':price_for_passenger' => $price_for_passenger, ':distance' => $distance, ]; $sqlInsert = "INSERT INTO `ride` (`start_location`,`end_location`,`date`,`time`,`endtime`, `price`,`passenger_id`,`driver_id`,`status`,`carType`, `price_for_driver`,`price_for_passenger`,`distance`) VALUES (:start_location,:end_location,:date,:time,:endtime, :price,:passenger_id,:driver_id,:status,:carType, :price_for_driver,:price_for_passenger,:distance)"; try { // ═══════════════════════════════════════════════════════════ // STEP A — ride DB أولاً (هو المرجع الأساسي) // ═══════════════════════════════════════════════════════════ $stmtRide = $con_ride->prepare($sqlInsert); $stmtRide->execute($insertData); $insertedId = $con_ride->lastInsertId(); if (!$insertedId) { error_log("[add_ride] ride DB insert returned no ID."); printFailure("Failed to create ride"); exit; } error_log("[add_ride] ride DB insert success. RideID=$insertedId"); // ═══════════════════════════════════════════════════════════ // STEP B — primary DB ثانياً (نسخة أرشيفية بنفس الـ ID) // ═══════════════════════════════════════════════════════════ $sqlInsertWithId = "INSERT INTO `ride` (`id`,`start_location`,`end_location`,`date`,`time`,`endtime`, `price`,`passenger_id`,`driver_id`,`status`,`carType`, `price_for_driver`,`price_for_passenger`,`distance`) VALUES (:id,:start_location,:end_location,:date,:time,:endtime, :price,:passenger_id,:driver_id,:status,:carType, :price_for_driver,:price_for_passenger,:distance)"; try { $primaryData = $insertData; $primaryData[':id'] = $insertedId; $stmtPrimary = $con->prepare($sqlInsertWithId); $stmtPrimary->execute($primaryData); error_log("[add_ride] primary DB sync success. RideID=$insertedId"); } catch (PDOException $ePrimary) { // لا نوقف العملية — ride DB هو المرجع error_log("[add_ride] primary DB sync WARNING: " . $ePrimary->getMessage()); } // ═══════════════════════════════════════════════════════════ // STEP C — بناء الـ payload وإرسال الرحلة للسائقين // ═══════════════════════════════════════════════════════════ $kazan = (float) $price - (float) $price_for_driver; $payload = [ (string) $startLat, (string) $startLng, number_format((float) $price, 2, '.', ''), (string) $endLat, (string) $endLng, (string) $distance_text, "", (string) $passenger_id, (string) $passenger_name, (string) $passenger_token, (string) $passenger_phone, (string) $distance, "1", (string) $is_wallet, (string) $distance, (string) $duration_text, (string) $insertedId, "", "", (string) $duration_text, $has_steps ?: 'false', (string) $step0, (string) $step1, (string) $step2, (string) $step3, (string) $step4, number_format((float) $price_for_driver, 2, '.', ''), (string) $passenger_wallet, (string) $passenger_email, (string) $start_name_loc, (string) $end_name_loc, (string) $carType, number_format($kazan, 2, '.', ''), (string) $passenger_rating, ]; // Direct dispatch للسائقين القريبين $driversData = findBestDrivers($con, $startLat, $startLng, $carType); if (!empty($driversData)) { dispatchRideToDrivers($driversData, $insertedId, $payload, $start_name_loc, $encryptionHelper); error_log("[add_ride] Dispatched RideID=$insertedId to " . count($driversData) . " drivers."); } else { error_log("[add_ride] No direct drivers found for RideID=$insertedId — market only."); } // Broadcast للـ marketplace دائماً broadcastRideToMarket($insertedId, $startLat, $startLng, $payload); // رد النجاح للتطبيق printSuccess($insertedId); } catch (PDOException $e) { error_log("[add_ride] CRITICAL ride DB error: " . $e->getMessage()); printFailure("Database error"); }