<?php
ob_start(); // ✅ بدء التخزين المؤقت للمخرجات لمنع أي مخرجات غير JSON
header('Content-Type: application/json; charset=UTF-8');
header("Access-Control-Allow-Origin: *");
require 'config.php';
// ✅ مسح أي مخرجات غير مرغوبة من config (مثل مسافات أو BOM) حتى يبقى الرد JSON فقط
if (ob_get_length()) ob_clean();

// ✅ دالة إغلاق مخصصة للتعامل مع الأخطاء القاتلة وإرجاع JSON بدلاً من HTML
register_shutdown_function(function() {
    $error = error_get_last();
    if ($error && ($error['type'] === E_ERROR || $error['type'] === E_PARSE || $error['type'] === E_CORE_ERROR || $error['type'] === E_COMPILE_ERROR)) {
        if (ob_get_length()) ob_clean();
        http_response_code(500);
        header('Content-Type: application/json; charset=utf-8');
        echo json_encode([
            'status' => 'error',
            'message' => 'حدث خطأ قاتل في الخادم: ' . $error['message'],
            'file' => $error['file'],
            'line' => $error['line']
        ], JSON_UNESCAPED_UNICODE);
        exit;
    }
});

// ✅ دالة مساعدة لتنظيف وتنسيق حقل الوقت القادم من قاعدة البيانات
function normalize_timestamp_string($value) {
    if ($value instanceof DateTimeInterface) {
        return $value->format('Y-m-d H:i:s');
    }
    $str = (string)$value;
    // إزالة الأحرف غير القابلة للطباعة (التي تسبب رموز غريبة مثل � أو بايتات ثنائية)
    $str = preg_replace('/[^\x20-\x7E]/u', '', $str);
    $str = trim($str);

    if ($str === '') {
        return null;
    }

    // إذا كانت قيمة رقمية (ثواني يونكس)
    if (preg_match('/^\d{10}$/', $str)) {
        return date('Y-m-d H:i:s', (int)$str);
    }

    // إذا كانت بالفعل بصيغة قياسية
    if (preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', $str)) {
        return $str;
    }

    // محاولة تفسير أي صيغة أخرى
    $ts = strtotime($str);
    if ($ts !== false) {
        return date('Y-m-d H:i:s', $ts);
    }

    // كحل أخير: إذا لم يكن النص قابلاً للتحويل إلى وقت صالح نعتبره غير صالح
    // حتى لا نعيد قيم مثل 0.71 أو إحداثيات كنص وقت
    return null;
}

// ✅ تحسين: إعدادات PHP للأداء
ini_set('max_execution_time', 10); // ✅ timeout قصير للاستعلامات السريعة
set_time_limit(10);

$device_id = $_GET['device_id'] ?? null;
if (!$device_id) {
    echo json_encode(["status" => "error", "message" => "❌ يرجى تحديد device_id"]);
    exit();
}

try {
    // ✅ استخدام Firebase إذا كان مفعلاً
    if (defined('USE_FIREBASE') && USE_FIREBASE) {
        $data = FirebaseService::getLastLocation($device_id);
        
        if ($data) {
            // ✅ تحسين: التأكد من أن البيانات صالحة
            if (isset($data['latitude']) && isset($data['longitude']) && 
                is_numeric($data['latitude']) && is_numeric($data['longitude'])) {
                echo json_encode(["status" => "success", "data" => $data], JSON_UNESCAPED_UNICODE);
            } else {
                echo json_encode(["status" => "error", "message" => "❌ بيانات الموقع غير صالحة"], JSON_UNESCAPED_UNICODE);
            }
        } else {
            echo json_encode(["status" => "error", "message" => "❌ لا توجد بيانات متاحة"], JSON_UNESCAPED_UNICODE);
        }
    } else {
        // ✅ استخدام MySQL (الطريقة القديمة)
        // ملاحظة: نعتمد على حقل timestamp كمرجع أساسي للوقت،
        // ولا نستخدم ts_date/ts_time إلا كاحتياطي إذا كان timestamp مفقوداً.
        $query = "
            SELECT 
                device_id,
                device_name,
                latitude,
                longitude,
                ts_date,
                ts_time,
                timestamp,
                battery,
                speed,
                accuracy,
                altitude,
                heading
            FROM locations
            WHERE device_id = :device_id
            ORDER BY timestamp DESC
            LIMIT 1
        ";

        $stmt = $conn->prepare($query);
        $stmt->execute([':device_id' => $device_id]);
        $data = $stmt->fetch(PDO::FETCH_ASSOC);

        if ($data) {
            // تنظيف حقل الوقت قبل إرساله للواجهة
            $rawTs = $data['timestamp'] ?? null;

            // 1) المحاولة الأولى: الاعتماد على حقل timestamp كما هو
            if ($rawTs !== null) {
                $data['timestamp'] = normalize_timestamp_string($rawTs);
            } else {
                $data['timestamp'] = null;
            }

            // 2) إذا خرجت القيمة غير صالحة (null)، نجرب تركيبها من ts_date + ts_time إن توفرا
            if ($data['timestamp'] === null) {
                $rawDate = $data['ts_date'] ?? null;
                $rawTime = $data['ts_time'] ?? null;
                if ($rawDate !== null || $rawTime !== null) {
                    $combined = trim(($rawDate ?? '') . ' ' . ($rawTime ?? ''));
                    $data['timestamp'] = normalize_timestamp_string($combined);
                }
            }

            // إضافة وقت بصيغة 12 ساعة مع (ص/م) بدون تغيير قيمة timestamp الأصلية
            if (!empty($data['timestamp'])) {
                $ts = strtotime($data['timestamp']);
                if ($ts !== false) {
                    $time12 = date('g:i A', $ts); // 1:30 AM / PM
                    $time12 = str_replace(['AM', 'PM'], ['ص', 'م'], $time12); // 1:30 ص / م
                    $data['time_12h'] = $time12;
                }
            }

            // ✅ تحسين: التأكد من أن البيانات صالحة
            if (isset($data['latitude']) && isset($data['longitude']) && 
                is_numeric($data['latitude']) && is_numeric($data['longitude'])) {
                echo json_encode(["status" => "success", "data" => $data], JSON_UNESCAPED_UNICODE);
            } else {
                echo json_encode(["status" => "error", "message" => "❌ بيانات الموقع غير صالحة"], JSON_UNESCAPED_UNICODE);
            }
        } else {
            echo json_encode(["status" => "error", "message" => "❌ لا توجد بيانات متاحة"], JSON_UNESCAPED_UNICODE);
        }
    }
} catch (Exception $e) {
    error_log("خطأ في get_latest_location.php: " . $e->getMessage());
    if (ob_get_length()) ob_clean();
    echo json_encode(["status" => "error", "message" => "❌ حدث خطأ: " . $e->getMessage()], JSON_UNESCAPED_UNICODE);
}
