getMessage()); http_response_code(500); echo json_encode(["status" => "failure", "message" => "Database connection failed"]); exit; } // استلام البيانات (يمكن استلام ID الرحلة أو ID الراكب) $passengerID = filterRequest("passengerID"); $rideID = filterRequest("id"); // إضافة استقبال متغير رقم الرحلة try { // ================================================================= // 1. الخطوة الأولى: تحديد استراتيجية البحث (بواسطة رقم الرحلة أو الراكب) // ================================================================= $sqlRide = "SELECT id, start_location, end_location, date, driver_id, passenger_id, price, status, created_at, DriverIsGoingToPassenger, rideTimeStart, rideTimeFinish, price_for_driver, distance FROM ride "; // المنطق الجديد: // إذا تم إرسال rideID، نبحث عن الرحلة المحددة بدقة (تجنباً لأي تضارب) // إذا لم يتم إرساله، نبحث عن أحدث رحلة للراكب (للتتبع المباشر) if (!empty($rideID)) { $sqlRide .= "WHERE id = :rideID"; } else { $sqlRide .= "WHERE passenger_id = :passengerID ORDER BY id DESC LIMIT 1"; } // نستخدم المتغير $con_ride (سيرفر الرحلات) $stmtRide = $con_ride->prepare($sqlRide); // ربط المتغيرات حسب نوع البحث if (!empty($rideID)) { $stmtRide->bindParam(':rideID', $rideID); } else { $stmtRide->bindParam(':passengerID', $passengerID); } $stmtRide->execute(); $rideData = $stmtRide->fetch(PDO::FETCH_ASSOC); // إذا لم يتم العثور على رحلة في سيرفر الرحلات، نوقف العملية if (!$rideData) { echo json_encode(["status" => "failure", "message" => "No ride found"]); exit; } // ================================================================= // 2. الخطوة الثانية: جلب البيانات الثابتة (سائق، سيارة، تقييم) من السيرفر الرئيسي ($con) // نستخدم المعرفات التي حصلنا عليها من نتيجة الاستعلام الأول // ================================================================= $driverID = $rideData['driver_id']; $pID = $rideData['passenger_id']; // نأخذ معرف الراكب من الرحلة نفسها لضمان التطابق // ملاحظة: استخدام :driverID_Sub في الاستعلام الفرعي لتجنب أخطاء PDO $sqlDetails = "SELECT passengers.first_name AS passengerName, passengers.last_name, CarRegistration.make, CarRegistration.model, CarRegistration.car_plate, CarRegistration.year, CarRegistration.color, CarRegistration.color_hex, driver.first_name AS driverName, driver.gender, driver.phone, ( SELECT ROUND(AVG(ratingDriver.rating), 2) FROM ratingDriver WHERE ratingDriver.driver_id = :driverID_Sub ) AS ratingDriver, driverToken.token AS token FROM driver LEFT JOIN passengers ON passengers.id = :passengerID LEFT JOIN CarRegistration ON CarRegistration.driverID = driver.id LEFT JOIN driverToken ON driverToken.captain_id = driver.id WHERE driver.id = :driverID"; // نستخدم المتغير الأصلي $con للسيرفر الرئيسي $stmtDetails = $con->prepare($sqlDetails); // نربط المتغيرات $stmtDetails->bindParam(':driverID', $driverID); $stmtDetails->bindParam(':driverID_Sub', $driverID); $stmtDetails->bindParam(':passengerID', $pID); $stmtDetails->execute(); $detailsData = $stmtDetails->fetch(PDO::FETCH_ASSOC); // ================================================================= // 3. الخطوة الثالثة: دمج البيانات وتجهيز الرد // ================================================================= $finalData = []; if ($detailsData) { // دمج مصفوفة الرحلة (من سيرفر الرحلات) مع مصفوفة التفاصيل (من الرئيسي) $finalData = array_merge($rideData, $detailsData); } else { // في حال كانت الرحلة بدون سائق بعد، نكتفي ببيانات الرحلة $finalData = $rideData; } // ================================================================= // 4. فك التشفير (Decrypt) // ================================================================= if ($finalData) { $fieldsToDecrypt = ['driverName', 'gender', 'phone', 'car_plate', 'passengerName', 'last_name', 'token']; foreach ($fieldsToDecrypt as $field) { if (!empty($finalData[$field])) { $finalData[$field] = $encryptionHelper->decryptData($finalData[$field]); } } } echo json_encode([ "status" => "success", "data" => $finalData ]); } catch (Exception $e) { error_log("API Error: " . $e->getMessage()); http_response_code(500); echo json_encode(["status" => "failure", "message" => "Server Error: " . $e->getMessage()]); } ?>