<?php
// إرجاع مسار «مُلتصق بالطريق» عبر Mapbox Map Matching API (مع تقطيع للنقاط عند الحاجة)
// مع دعم التاريخ/النطاق مثل get_device_stops_optimized.php
// @author Ibrahim Al-Mansour

session_start();
require_once __DIR__ . '/config.php';

header('Content-Type: application/json; charset=utf-8');

if (!isset($_GET['device_id'])) {
    http_response_code(400);
    echo json_encode(['status' => 'error', 'message' => 'device_id مطلوب']);
    exit;
}

$deviceId = trim($_GET['device_id']);
$fromDate = trim($_GET['from_date'] ?? '');
$toDate   = trim($_GET['to_date']   ?? '');
$date     = trim($_GET['date']      ?? '');

// احسب النطاق الزمني
$nowDay = date('Y-m-d');
if ($fromDate || $toDate) {
    $start = $fromDate ?: (($date ?: $nowDay) . ' 00:00:00');
    $end   = $toDate   ?: (($date ?: $nowDay) . ' 23:59:59');
} else {
    $day = $date ?: $nowDay;
    $start = $day . ' 00:00:00';
    $end   = $day . ' 23:59:59';
}

// جلب النقاط الخام من قاعدة البيانات
try {
    $sql = "SELECT latitude AS lat, longitude AS lng, `timestamp` AS ts FROM locations WHERE device_id = :device_id AND `timestamp` BETWEEN :start AND :end ORDER BY `timestamp` ASC";
    $stmt = $conn->prepare($sql);
    $stmt->execute([$deviceId, $start, $end]);
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
    exit;
}

if (!$rows || count($rows) < 2) {
    echo json_encode(['status' => 'success', 'message' => 'لا توجد نقاط كافية للمسار', 'geometry' => null, 'raw' => $rows]);
    exit;
}

// إعدادات Mapbox (يجب أن يكون MAPBOX_TOKEN معرفاً في config.php أو كمتغير بيئة)
$mapboxToken = getenv('MAPBOX_TOKEN') ?: (defined('MAPBOX_TOKEN') ? constant('MAPBOX_TOKEN') : null);
if (!$mapboxToken) {
    // لا يوجد توكن: أعد المسار الخام كبديل
    echo json_encode([
        'status' => 'warning',
        'message' => 'MAPBOX_TOKEN غير مُعرّف، إرجاع مسار خام بدون محاذاة للطريق',
        'geometry' => [
            'type' => 'LineString', // نوع GeoJSON
            'coordinates' => array_map(function($r){return [floatval($r['lng']), floatval($r['lat'])];}, $rows)
        ],
        'provider' => 'raw',
    ]);
    exit;
}

// تقطيع النقاط إلى مجموعات لا تتجاوز 100 نقطة (حد API)
$chunks = [];
$chunkSize = 100; // حد Mapbox API لعدد النقاط في الطلب الواحد
for ($i = 0; $i < count($rows); $i += $chunkSize) {
    $chunks[] = array_slice($rows, $i, $chunkSize);
}

$mergedCoordinates = [];
foreach ($chunks as $idx => $chunk) {
    // صياغة الإحداثيات: lng,lat;lng,lat;...
    $coordPairs = array_map(function($r){
        $lng = floatval($r['lng']);
        $lat = floatval($r['lat']);
        return $lng . ',' . $lat;
    }, $chunk);

    $coordsParam = implode(';', $coordPairs);
    $url = "https://api.mapbox.com/matching/v5/mapbox/driving/" . $coordsParam . "?geometries=geojson&overview=full&steps=false&access_token=" . urlencode($mapboxToken); // بناء URL الطلب

    // طلب HTTP بسيط باستخدام file_get_contents؛ يمكن استبداله بـ curl إذا لزم
    $resp = @file_get_contents($url); // استخدام @ لإخفاء التحذيرات
    if ($resp === false) {
        // فشل الاستدعاء: استخدم النقاط الخام لهذا الجزء كبديل
        $fallback = array_map(function($r){return [floatval($r['lng']), floatval($r['lat'])];}, $chunk);
        $mergedCoordinates = array_merge($mergedCoordinates, $fallback);
        continue;
    }
    $json = json_decode($resp, true);
    if (!$json || !isset($json['matchings'][0]['geometry']['coordinates'])) {
        $fallback = array_map(function($r){return [floatval($r['lng']), floatval($r['lat'])];}, $chunk);
        $mergedCoordinates = array_merge($mergedCoordinates, $fallback); // إذا لم يتم العثور على تطابق، استخدم الخام
        continue;
    }
    $coords = $json['matchings'][0]['geometry']['coordinates'];
    // دمج مع الحفاظ على الاتصال بين المجموعات
    if (!empty($mergedCoordinates)) {
        // تجنب تكرار نقطة التماس
        $last = end($mergedCoordinates);
        if ($last === $coords[0]) {
            array_shift($coords);
        }
    }
    $mergedCoordinates = array_merge($mergedCoordinates, $coords);
}

echo json_encode([
    'status' => 'success',
    'provider' => 'mapbox',
    'geometry' => [
        'type' => 'LineString',
        'coordinates' => $mergedCoordinates
    ],
    'meta' => [
        'points' => count($rows),
        'chunks' => count($chunks),
        'device_id' => $deviceId,
        'start' => $start,
        'end' => $end,
    ]
], JSON_UNESCAPED_UNICODE);