<?php
// cancel_ride_by_driver.php
require_once __DIR__ . '/../../connect.php';

$rideId         = filterRequest("ride_id");
$driverId       = filterRequest("driver_id");
$reason         = filterRequest("reason");
$passengerToken = filterRequest("passenger_token"); 

// تثبيت الحالة
$statusText     = "CancelFromDriverAfterApply"; 

if (!$rideId || !$driverId) {
    jsonError("Missing parameters");
    exit;
}

try {
    $con->beginTransaction();

    // ---------------------------------------------------------
    // 1. معالجة driver_orders (Insert or Update)
    // ---------------------------------------------------------
    $checkStmt = $con->prepare("SELECT order_id FROM driver_orders WHERE order_id = ? AND driver_id = ?");
    $checkStmt->execute([$rideId, $driverId]);
    
    if ($checkStmt->rowCount() > 0) {
        // موجود: تحديث
        $stmtLog = $con->prepare("UPDATE driver_orders SET status = ?, notes = ?, created_at = NOW() WHERE order_id = ? AND driver_id = ?");
        $stmtLog->execute([$statusText, $reason, $rideId, $driverId]);
    } else {
        // غير موجود: إدخال
        $stmtLog = $con->prepare("INSERT INTO driver_orders (driver_id, order_id, status, created_at, notes) VALUES (?, ?, ?, NOW(), ?)");
        $stmtLog->execute([$driverId, $rideId, $statusText, $reason]);
    }

    // ---------------------------------------------------------
    // 2. منطق الحظر (Business Logic)
    // ---------------------------------------------------------
    $stmtCount = $con->prepare("
        SELECT COUNT(*) FROM driver_orders 
        WHERE driver_id = ? 
        AND status = ? 
        AND created_at >= NOW() - INTERVAL 1 DAY
    ");
    $stmtCount->execute([$driverId, $statusText]);
    $cancelCount = $stmtCount->fetchColumn();

    $isBlocked = false;
    $blockUntil = "";

    if ($cancelCount >= 3) {
        $isBlocked = true;
        $blockUntil = date('Y-m-d H:i:s', strtotime('+4 hours'));
        // يمكنك هنا تحديث حالة السائق في جدول driver إذا لزم الأمر
    }

    // ---------------------------------------------------------
    // 3. تحديث حالة الرحلة في جدول ride
    // ---------------------------------------------------------
    $sqlRide = "UPDATE ride SET status = ?, driver_id = 0 WHERE id = ?";
    
    // Local DB
    $con->prepare($sqlRide)->execute([$statusText, $rideId]);
    
    // Remote DB (إن وجد)
    if (isset($con_ride)) {
        $con_ride->prepare($sqlRide)->execute([$statusText, $rideId]);
    }

    // ---------------------------------------------------------
    // 4. إشعار الراكب
    // ---------------------------------------------------------
    
    // أ) Socket (يحتاج Passenger ID)
    $stmtPas = $con->prepare("SELECT passenger_id FROM ride WHERE id = ?");
    $stmtPas->execute([$rideId]);
    $passenger_id = $stmtPas->fetchColumn();

    if ($passenger_id) {
        $socketPayload = [
            'ride_id' => $rideId, 
            'status'  => 'cancelled_by_driver', 
            'msg'     => 'تم إلغاء الرحلة من قبل السائق'
        ];
        if (function_exists('notifyPassengerOnRideServer')) {
            notifyPassengerOnRideServer($passenger_id, $socketPayload);
        }
    }

    // ب) FCM (Internal)
    if (!empty($passengerToken)) {
        $fcmData = [
            'ride_id'  => (string)$rideId
        ];
        
        // 🔥 استخدام الدالة الجديدة
        sendFCM_Internal(
            $passengerToken,                  // الهدف
            "تم إلغاء الرحلة ❌",             // العنوان
            "عذراً، قام السائق بإلغاء الرحلة.", // النص
            $fcmData,                         // البيانات
            "Cancel Trip from driver",        // التصنيف (تأكد أنه يطابق ما في تطبيق الراكب)
            false                             // ليس Topic
        );
    }

    $con->commit();

    // 5. الرد للفلاتر
    echo json_encode([
        "status"       => "success",
        "cancel_count" => $cancelCount,
        "is_blocked"   => $isBlocked,
        "block_until"  => $blockUntil
    ]);

} catch (PDOException $e) {
    if ($con->inTransaction()) $con->rollBack();
    jsonError("DB Error: " . $e->getMessage());
}
?>