<?php
/**
 * Firebase Realtime Database Service for PHP
 * 
 * خدمة للاتصال بـ Firebase Realtime Database من PHP
 * تستخدم REST API للوصول إلى البيانات
 * 
 * @author Almanara GPS Team
 * @version 1.0
 */

class FirebaseService {
    private static $databaseUrl;
    private static $apiKey;
    private static $initialized = false;
    
    /**
     * تهيئة خدمة Firebase
     * 
     * @param string $projectId معرف المشروع من Firebase Console
     * @param string $apiKey مفتاح API (اختياري، قد لا يكون مطلوباً للقراءة)
     * @param string $databaseUrl URL قاعدة البيانات الكامل (اختياري)
     *                           إذا لم يتم تحديده، سيتم بناؤه تلقائياً
     *                           مثال: https://almanara-65382-default-rtdb.us-central1.firebasedatabase.app
     */
    public static function initialize($projectId, $apiKey = '', $databaseUrl = null) {
        if ($databaseUrl) {
            // استخدام URL المحدد مباشرة
            self::$databaseUrl = rtrim($databaseUrl, '/');
        } else {
            // بناء URL قاعدة البيانات تلقائياً
            // ملاحظة: قد تحتاج لتغيير المنطقة حسب إعدادات Firebase الخاصة بك
            // يمكنك العثور على URL الصحيح من Firebase Console → Realtime Database → Data
            // أو من google-services.json في حقل database_url
            self::$databaseUrl = "https://{$projectId}-default-rtdb.firebaseio.com";
        }
        self::$apiKey = $apiKey;
        self::$initialized = true;
    }
    
    /**
     * جلب البيانات من Firebase
     * 
     * @param string $path مسار البيانات (مثال: locations/device123/2024-01-15)
     * @param array $queryParams معاملات الاستعلام (orderBy, limitToFirst, etc.)
     * @return array|null البيانات المسترجعة أو null في حالة الخطأ
     */
    public static function get($path, $queryParams = []) {
        if (!self::$initialized) {
            error_log("❌ FirebaseService: لم يتم تهيئة الخدمة. استدعِ initialize() أولاً.");
            return null;
        }
        
        $url = self::$databaseUrl . '/' . trim($path, '/') . '.json';
        
        // إضافة معاملات الاستعلام
        if (!empty($queryParams)) {
            $url .= '?' . http_build_query($queryParams);
        }
        
        // إضافة API key إذا لزم
        if (self::$apiKey) {
            $url .= (strpos($url, '?') !== false ? '&' : '?') . 'key=' . urlencode(self::$apiKey);
        }
        
        try {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_TIMEOUT, 5); // ✅ تقليل timeout إلى 5 ثوانٍ للسرعة
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2); // ✅ تقليل timeout الاتصال إلى 2 ثانية
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
            curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); // ✅ استخدام اتصال جديد
            curl_setopt($ch, CURLOPT_FORBID_REUSE, true); // ✅ عدم إعادة استخدام الاتصال
            
            $response = curl_exec($ch);
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            $error = curl_error($ch);
            curl_close($ch);
            
            if ($error) {
                error_log("❌ FirebaseService: خطأ في cURL: " . $error);
                return null;
            }
            
            if ($httpCode !== 200) {
                error_log("❌ FirebaseService: HTTP Error {$httpCode} عند جلب: {$path}");
                return null;
            }
            
            $data = json_decode($response, true);
            
            // Firebase يعيد null إذا لم توجد بيانات
            if ($data === null && json_last_error() !== JSON_ERROR_NONE) {
                error_log("❌ FirebaseService: خطأ في فك ترميز JSON: " . json_last_error_msg());
                return null;
            }
            
            return $data;
            
        } catch (Exception $e) {
            error_log("❌ FirebaseService: استثناء: " . $e->getMessage());
            return null;
        }
    }
    
    /**
     * جلب آخر موقع لجهاز معين
     * 
     * @param string $deviceId معرف الجهاز
     * @return array|null بيانات آخر موقع أو null
     */
    public static function getLastLocation($deviceId) {
        if (empty($deviceId)) {
            return null;
        }
        
        // جلب جميع التواريخ للجهاز
        $datesPath = "locations/{$deviceId}";
        $dates = self::get($datesPath);
        
        if (empty($dates) || !is_array($dates)) {
            return null;
        }
        
        // ترتيب التواريخ من الأحدث للأقدم
        krsort($dates);
        
        // البحث في آخر تاريخ عن آخر موقع
        foreach ($dates as $date => $locations) {
            if (!is_array($locations)) {
                continue;
            }
            
            // ترتيب المواقع حسب المفتاح (timestamp) من الأحدث للأقدم
            krsort($locations);
            
            // أخذ آخر موقع
            foreach ($locations as $timestamp => $location) {
                if (is_array($location) && isset($location['latitude']) && isset($location['longitude'])) {
                    return $location;
                }
            }
        }
        
        return null;
    }
    
    /**
     * جلب جميع المواقع لجهاز معين في تاريخ محدد
     * 
     * @param string $deviceId معرف الجهاز
     * @param string $date التاريخ بصيغة YYYY-MM-DD
     * @return array مصفوفة المواقع
     */
    public static function getLocationsByDate($deviceId, $date) {
        if (empty($deviceId) || empty($date)) {
            return [];
        }
        
        $path = "locations/{$deviceId}/{$date}";
        $locations = self::get($path);
        
        if (empty($locations) || !is_array($locations)) {
            return [];
        }
        
        // تحويل البيانات إلى مصفوفة مرتبة حسب timestamp
        $result = [];
        foreach ($locations as $timestamp => $location) {
            if (is_array($location)) {
                // ✅ تحسين: التحقق من وجود الإحداثيات قبل الإضافة
                $lat = isset($location['latitude']) ? floatval($location['latitude']) : null;
                $lng = isset($location['longitude']) ? floatval($location['longitude']) : null;
                
                // ✅ تخطي النقاط بدون إحداثيات صالحة
                if ($lat === null || $lng === null || ($lat == 0 && $lng == 0)) {
                    continue;
                }
                
                // إضافة timestamp إذا لم يكن موجوداً
                if (!isset($location['timestamp'])) {
                    // ✅ تحسين: معالجة timestamp كـ string أو number
                    if (is_numeric($timestamp)) {
                        // إذا كان timestamp بالمللي ثانية
                        if ($timestamp > 1000000000000) {
                            $location['timestamp'] = date('Y-m-d H:i:s', $timestamp / 1000);
                        } else {
                            $location['timestamp'] = date('Y-m-d H:i:s', $timestamp);
                        }
                    } else {
                        // إذا كان timestamp كـ string
                        $location['timestamp'] = $timestamp;
                    }
                }
                
                // ✅ التأكد من أن timestamp بصيغة صحيحة
                if (isset($location['timestamp'])) {
                    $timeCheck = strtotime($location['timestamp']);
                    if ($timeCheck === false) {
                        // محاولة إصلاح timestamp
                        $location['timestamp'] = date('Y-m-d H:i:s');
                    }
                }
                
                $result[] = $location;
            }
        }
        
        // ترتيب حسب timestamp
        usort($result, function($a, $b) {
            $timeA = isset($a['timestamp']) ? strtotime($a['timestamp']) : 0;
            $timeB = isset($b['timestamp']) ? strtotime($b['timestamp']) : 0;
            return $timeA <=> $timeB;
        });
        
        return $result;
    }
    
    /**
     * جلب المواقع في نطاق زمني محدد
     * 
     * @param string $deviceId معرف الجهاز
     * @param string $startTime وقت البداية (Y-m-d H:i:s)
     * @param string $endTime وقت النهاية (Y-m-d H:i:s)
     * @return array مصفوفة المواقع
     */
    public static function getLocationsByTimeRange($deviceId, $startTime, $endTime) {
        if (empty($deviceId) || empty($startTime) || empty($endTime)) {
            return [];
        }
        
        $startTimestamp = strtotime($startTime);
        $endTimestamp = strtotime($endTime);
        
        if ($startTimestamp === false || $endTimestamp === false) {
            return [];
        }
        
        // حساب التواريخ في النطاق
        $startDate = date('Y-m-d', $startTimestamp);
        $endDate = date('Y-m-d', $endTimestamp);
        
        $allLocations = [];
        
        // جلب البيانات لكل تاريخ في النطاق
        $currentDate = $startDate;
        while ($currentDate <= $endDate) {
            $locations = self::getLocationsByDate($deviceId, $currentDate);
            
            foreach ($locations as $location) {
                $locationTime = isset($location['timestamp']) ? strtotime($location['timestamp']) : 0;
                
                // تصفية حسب الوقت
                if ($locationTime >= $startTimestamp && $locationTime <= $endTimestamp) {
                    $allLocations[] = $location;
                }
            }
            
            // الانتقال للتاريخ التالي
            $currentDate = date('Y-m-d', strtotime($currentDate . ' +1 day'));
        }
        
        // ترتيب حسب الوقت
        usort($allLocations, function($a, $b) {
            $timeA = isset($a['timestamp']) ? strtotime($a['timestamp']) : 0;
            $timeB = isset($b['timestamp']) ? strtotime($b['timestamp']) : 0;
            return $timeA <=> $timeB;
        });
        
        return $allLocations;
    }
    
    /**
     * جلب آخر موقع لجهاز معين
     * 
     * @param string $deviceId معرف الجهاز
     * @return array|null بيانات آخر موقع أو null
     */
    private static function getLastLocationForDevice($deviceId) {
        // استخدام shallow query للحصول على قائمة التواريخ فقط
        $url = self::$databaseUrl . '/locations/' . urlencode($deviceId) . '.json?shallow=true';
        if (self::$apiKey) {
            $url .= '&key=' . urlencode(self::$apiKey);
        }
        
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 10);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
        
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        
        if ($httpCode !== 200) {
            return null;
        }
        
        $dates = json_decode($response, true);
        
        if (empty($dates) || !is_array($dates)) {
            return null;
        }
        
        // ترتيب التواريخ من الأحدث للأقدم
        krsort($dates);
        
        // البحث في آخر 3 تواريخ (للسرعة)
        $checkedDates = 0;
        foreach ($dates as $date => $value) {
            if ($checkedDates >= 3) break; // فحص آخر 3 تواريخ فقط
            
            // جلب قائمة المواقع في هذا التاريخ (shallow query)
            $url2 = self::$databaseUrl . '/locations/' . urlencode($deviceId) . '/' . urlencode($date) . '.json?shallow=true';
            if (self::$apiKey) {
                $url2 .= '&key=' . urlencode(self::$apiKey);
            }
            
            $ch2 = curl_init();
            curl_setopt($ch2, CURLOPT_URL, $url2);
            curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch2, CURLOPT_TIMEOUT, 10);
            curl_setopt($ch2, CURLOPT_CONNECTTIMEOUT, 5);
            curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER, true);
            
            $response2 = curl_exec($ch2);
            $httpCode2 = curl_getinfo($ch2, CURLINFO_HTTP_CODE);
            curl_close($ch2);
            
            if ($httpCode2 === 200) {
                $locations = json_decode($response2, true);
                
                if (is_array($locations) && !empty($locations)) {
                    // الحصول على آخر مفتاح (timestamp)
                    $lastLocationKey = max(array_keys($locations));
                    $lastLocation = self::get("locations/{$deviceId}/{$date}/{$lastLocationKey}");
                    
                    if (is_array($lastLocation) && isset($lastLocation['latitude']) && isset($lastLocation['longitude'])) {
                        return $lastLocation;
                    }
                }
            }
            
            $checkedDates++;
        }
        
        return null;
    }
    
    /**
     * جلب آخر موقع لجهاز معين (محسّن - آخر تاريخ فقط)
     * 
     * ✅ تحسين: استخدام shallow query + orderBy للحصول على آخر تاريخ وموقع فقط
     * هذا يقلل حجم البيانات المطلوبة بشكل كبير
     * 
     * @param string $deviceId معرف الجهاز
     * @return array|null بيانات آخر موقع أو null
     */
    private static function getLastLocationForDeviceFast($deviceId) {
        // جلب آخر تاريخ فقط (shallow query)
        $url = self::$databaseUrl . '/locations/' . urlencode($deviceId) . '.json?shallow=true';
        if (self::$apiKey) {
            $url .= '&key=' . urlencode(self::$apiKey);
        }
        
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 5); // ✅ زيادة timeout إلى 5 ثوانٍ لضمان جلب البيانات
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3); // ✅ زيادة connection timeout إلى 3 ثوانٍ
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
        
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        
        if ($httpCode !== 200) {
            return null;
        }
        
        $dates = json_decode($response, true);
        
        if (empty($dates) || !is_array($dates)) {
            return null;
        }
        
        // الحصول على آخر تاريخ (ترتيب المفاتيح)
        krsort($dates);
        $lastDate = array_key_first($dates);
        
        if (empty($lastDate)) {
            return null;
        }
        
        // جلب آخر موقع من آخر تاريخ (shallow query)
        $url2 = self::$databaseUrl . '/locations/' . urlencode($deviceId) . '/' . urlencode($lastDate) . '.json?shallow=true';
        if (self::$apiKey) {
            $url2 .= '&key=' . urlencode(self::$apiKey);
        }
        
        $ch2 = curl_init();
        curl_setopt($ch2, CURLOPT_URL, $url2);
        curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch2, CURLOPT_TIMEOUT, 5); // ✅ زيادة timeout إلى 5 ثوانٍ
        curl_setopt($ch2, CURLOPT_CONNECTTIMEOUT, 3); // ✅ زيادة connection timeout إلى 3 ثوانٍ
        curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER, true);
        
        $response2 = curl_exec($ch2);
        $httpCode2 = curl_getinfo($ch2, CURLINFO_HTTP_CODE);
        curl_close($ch2);
        
        if ($httpCode2 !== 200) {
            return null;
        }
        
        $locations = json_decode($response2, true);
        
        if (empty($locations) || !is_array($locations)) {
            return null;
        }
        
        // الحصول على آخر مفتاح (timestamp) - ترتيب المفاتيح
        krsort($locations);
        $lastLocationKey = array_key_first($locations);
        
        if (empty($lastLocationKey)) {
            return null;
        }
        
        // جلب بيانات آخر موقع
        $lastLocation = self::get("locations/{$deviceId}/{$lastDate}/{$lastLocationKey}");
        
        if (is_array($lastLocation) && isset($lastLocation['latitude']) && isset($lastLocation['longitude'])) {
            return $lastLocation;
        }
        
        return null;
    }
    
    /**
     * جلب device_name فقط لجهاز معين (سريع جداً)
     * 
     * @param string $deviceId معرف الجهاز
     * @return string|null device_name أو null
     */
    public static function getDeviceName($deviceId) {
        // جلب آخر موقع للحصول على device_name فقط
        $lastLocation = self::getLastLocationForDeviceFast($deviceId);
        
        if ($lastLocation && isset($lastLocation['device_name'])) {
            $deviceName = trim($lastLocation['device_name']);
            // ✅ تجاهل الأجهزة التي اسمها "Unknown Device" أو يساوي device_id
            if ($deviceName !== 'Unknown Device' && 
                !empty($deviceName) && 
                $deviceName !== $deviceId) {
                return $deviceName;
            }
        }
        
        return null;
    }
    
    /**
     * جلب device_name من أي موقع في آخر N أيام (طريقة بديلة)
     * 
     * @param string $deviceId معرف الجهاز
     * @param int $days عدد الأيام للبحث (افتراضي: 7)
     * @return string|null device_name أو null
     */
    public static function getDeviceNameFromAnyLocation($deviceId, $days = 7) {
        try {
            // جلب قائمة التواريخ من آخر N أيام
            $dates = [];
            for ($i = 0; $i < $days; $i++) {
                $date = date('Y-m-d', strtotime("-$i days"));
                $dates[] = $date;
            }
            
            // البحث في كل تاريخ من الأحدث للأقدم
            foreach ($dates as $date) {
                $url = self::$databaseUrl . '/locations/' . urlencode($deviceId) . '/' . urlencode($date) . '.json?shallow=true';
                if (self::$apiKey) {
                    $url .= '&key=' . urlencode(self::$apiKey);
                }
                
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $url);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_TIMEOUT, 3);
                curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
                
                $response = curl_exec($ch);
                $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
                curl_close($ch);
                
                if ($httpCode === 200 && $response) {
                    $locations = json_decode($response, true);
                    if (is_array($locations) && !empty($locations)) {
                        // جلب أول موقع من هذا التاريخ
                        $firstLocationKey = array_key_first($locations);
                        $location = self::get("locations/{$deviceId}/{$date}/{$firstLocationKey}");
                        
                        if ($location && isset($location['device_name'])) {
                            $deviceName = trim($location['device_name']);
                            if ($deviceName !== 'Unknown Device' && 
                                !empty($deviceName) && 
                                $deviceName !== $deviceId) {
                                return $deviceName;
                            }
                        }
                    }
                }
            }
        } catch (Exception $e) {
            // تجاهل الأخطاء
        }
        
        return null;
    }
    
    /**
     * جلب قائمة جميع الأجهزة (محسّن جداً - lazy loading)
     * 
     * ✅ تحسين كبير: جلب قائمة الأجهزة فقط بدون آخر موقع
     * آخر موقع يُجلب عند الحاجة فقط (عند اختيار الجهاز)
     * هذا يقلل الوقت من دقائق إلى ثوانٍ
     * 
     * @param bool $includeLastLocation جلب آخر موقع لكل جهاز (افتراضي: false للسرعة)
     * @return array مصفوفة الأجهزة
     */
    public static function getAllDevices($includeLastLocation = false) {
        // ✅ الطريقة المحسّنة جداً: جلب قائمة الأجهزة فقط (shallow query)
        $locationsPath = "locations";
        
        $url = self::$databaseUrl . '/' . trim($locationsPath, '/') . '.json?shallow=true';
        if (self::$apiKey) {
            $url .= '&key=' . urlencode(self::$apiKey);
        }
        
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 5); // ✅ تقليل timeout إلى 5 ثوانٍ للسرعة
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
        
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $error = curl_error($ch);
        curl_close($ch);
        
        if ($error || $httpCode !== 200) {
            return [];
        }
        
        $deviceList = json_decode($response, true);
        
        if (empty($deviceList) || !is_array($deviceList)) {
            return [];
        }
        
        $devices = [];
        $devicesToDelete = []; // قائمة الأجهزة التي يجب حذفها (Unknown Device)
        $deviceIds = array_filter(array_keys($deviceList), function($id) {
            return !empty($id) && is_string($id);
        });
        
        // ✅ إذا كان المطلوب جلب آخر موقع، استخدم batch processing
        if ($includeLastLocation) {
            // جلب آخر موقع لعدد محدود من الأجهزة فقط (الأول 20) لتسريع العملية
            $deviceIdsToProcess = array_slice($deviceIds, 0, 20);
            
            foreach ($deviceIdsToProcess as $deviceId) {
                $lastLocation = self::getLastLocationForDeviceFast($deviceId);
                
                if ($lastLocation) {
                    $deviceName = $lastLocation['device_name'] ?? $deviceId;
                    
                    // ✅ تجاهل الأجهزة التي اسمها "Unknown Device"
                    if (trim($deviceName) === 'Unknown Device' || empty(trim($deviceName))) {
                        $devicesToDelete[] = $deviceId;
                        continue;
                    }
                    
                    $devices[] = [
                        'device_id' => $deviceId,
                        'device_name' => $deviceName,
                        'last_location' => $lastLocation,
                        'last_seen' => $lastLocation['timestamp'] ?? null
                    ];
                } else {
                    $devices[] = [
                        'device_id' => $deviceId,
                        'device_name' => $deviceId,
                        'last_location' => null,
                        'last_seen' => null
                    ];
                }
            }
            
            // إضافة باقي الأجهزة بدون آخر موقع (للسرعة)
            foreach (array_slice($deviceIds, 20) as $deviceId) {
                $devices[] = [
                    'device_id' => $deviceId,
                    'device_name' => $deviceId,
                    'last_location' => null,
                    'last_seen' => null
                ];
            }
        } else {
            // ✅ الطريقة السريعة جداً: جلب قائمة الأجهزة فقط بدون آخر موقع
            // device_name سيتم جلبها عند الحاجة فقط (عند اختيار الجهاز)
            foreach ($deviceIds as $deviceId) {
                $devices[] = [
                    'device_id' => $deviceId,
                    'device_name' => $deviceId, // سيتم تحديثه عند جلب آخر موقع
                    'last_location' => null,
                    'last_seen' => null
                ];
            }
        }
        
        // ✅ حذف الأجهزة التي اسمها "Unknown Device" تلقائياً من Firebase (في الخلفية)
        if (!empty($devicesToDelete)) {
            // حذف في الخلفية بدون انتظار
            foreach ($devicesToDelete as $deviceIdToDelete) {
                self::deleteDevice($deviceIdToDelete);
            }
        }
        
        return $devices;
    }
    
    /**
     * حذف البيانات من Firebase
     * 
     * @param string $path مسار البيانات المراد حذفها (مثال: locations/device123)
     * @return bool true إذا تم الحذف بنجاح
     */
    public static function delete($path) {
        if (!self::$initialized) {
            error_log("❌ FirebaseService: لم يتم تهيئة الخدمة. استدعِ initialize() أولاً.");
            return false;
        }
        
        $url = self::$databaseUrl . '/' . trim($path, '/') . '.json';
        
        // إضافة API key إذا لزم
        if (self::$apiKey) {
            $url .= (strpos($url, '?') !== false ? '&' : '?') . 'key=' . urlencode(self::$apiKey);
        }
        
        try {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_TIMEOUT, 10);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
            curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
            curl_setopt($ch, CURLOPT_FORBID_REUSE, true);
            
            $response = curl_exec($ch);
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            $error = curl_error($ch);
            curl_close($ch);
            
            if ($error) {
                error_log("❌ FirebaseService: خطأ في cURL عند الحذف: " . $error);
                return false;
            }
            
            // Firebase يعيد null عند الحذف الناجح (HTTP 200)
            if ($httpCode === 200) {
                return true;
            }
            
            error_log("❌ FirebaseService: HTTP Error {$httpCode} عند حذف: {$path}");
            return false;
            
        } catch (Exception $e) {
            error_log("❌ FirebaseService: استثناء عند الحذف: " . $e->getMessage());
            return false;
        }
    }
    
    /**
     * حذف جهاز كامل من Firebase (جميع مواقعه)
     * 
     * @param string $deviceId معرف الجهاز
     * @return bool true إذا تم الحذف بنجاح
     */
    public static function deleteDevice($deviceId) {
        if (empty($deviceId)) {
            return false;
        }
        
        $path = "locations/{$deviceId}";
        return self::delete($path);
    }
    
    /**
     * تحديث اسم الجهاز في Firebase (في آخر موقع)
     * 
     * @param string $deviceId معرف الجهاز
     * @param string $newDeviceName الاسم الجديد للجهاز
     * @return bool true إذا تم التحديث بنجاح
     */
    public static function updateDeviceName($deviceId, $newDeviceName) {
        if (empty($deviceId) || empty($newDeviceName)) {
            error_log("❌ FirebaseService: updateDeviceName - deviceId أو newDeviceName فارغ");
            return false;
        }
        
        // جلب قائمة التواريخ (shallow query)
        $url = self::$databaseUrl . '/locations/' . urlencode($deviceId) . '.json?shallow=true';
        if (self::$apiKey) {
            $url .= '&key=' . urlencode(self::$apiKey);
        }
        
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 5);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
        
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        
        if ($httpCode !== 200) {
            error_log("⚠️ FirebaseService: updateDeviceName - فشل جلب التواريخ: {$deviceId}");
            return false;
        }
        
        $dates = json_decode($response, true);
        if (empty($dates) || !is_array($dates)) {
            error_log("⚠️ FirebaseService: updateDeviceName - لا توجد تواريخ للجهاز: {$deviceId}");
            return false;
        }
        
        // الحصول على آخر تاريخ
        krsort($dates);
        $lastDate = array_key_first($dates);
        
        if (empty($lastDate)) {
            return false;
        }
        
        // جلب آخر موقع من آخر تاريخ
        $url2 = self::$databaseUrl . '/locations/' . urlencode($deviceId) . '/' . urlencode($lastDate) . '.json?shallow=true';
        if (self::$apiKey) {
            $url2 .= '&key=' . urlencode(self::$apiKey);
        }
        
        $ch2 = curl_init();
        curl_setopt($ch2, CURLOPT_URL, $url2);
        curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch2, CURLOPT_TIMEOUT, 5);
        curl_setopt($ch2, CURLOPT_CONNECTTIMEOUT, 3);
        curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER, true);
        
        $response2 = curl_exec($ch2);
        $httpCode2 = curl_getinfo($ch2, CURLINFO_HTTP_CODE);
        curl_close($ch2);
        
        if ($httpCode2 !== 200) {
            error_log("⚠️ FirebaseService: updateDeviceName - فشل جلب المواقع: {$deviceId}/{$lastDate}");
            return false;
        }
        
        $locations = json_decode($response2, true);
        if (empty($locations) || !is_array($locations)) {
            return false;
        }
        
        // الحصول على آخر مفتاح (timestamp)
        krsort($locations);
        $lastLocationKey = array_key_first($locations);
        
        if (empty($lastLocationKey)) {
            return false;
        }
        
        // تحديث اسم الجهاز في آخر موقع
        // استخدام PATCH لتحديث حقل واحد فقط
        $url = self::$databaseUrl . '/locations/' . urlencode($deviceId) . '/' . urlencode($lastDate) . '/' . urlencode($lastLocationKey) . '/device_name.json';
        if (self::$apiKey) {
            $url .= (strpos($url, '?') !== false ? '&' : '?') . 'key=' . urlencode(self::$apiKey);
        }
        
        $ch3 = curl_init();
        curl_setopt($ch3, CURLOPT_URL, $url);
        curl_setopt($ch3, CURLOPT_CUSTOMREQUEST, 'PUT');
        curl_setopt($ch3, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch3, CURLOPT_POSTFIELDS, json_encode($newDeviceName));
        curl_setopt($ch3, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
        curl_setopt($ch3, CURLOPT_TIMEOUT, 5);
        curl_setopt($ch3, CURLOPT_CONNECTTIMEOUT, 2);
        curl_setopt($ch3, CURLOPT_SSL_VERIFYPEER, true);
        
        $response3 = curl_exec($ch3);
        $httpCode3 = curl_getinfo($ch3, CURLINFO_HTTP_CODE);
        $error3 = curl_error($ch3);
        curl_close($ch3);
        
        $result = ($httpCode3 === 200 && !$error3);
        
        if ($result) {
            error_log("✅ FirebaseService: تم تحديث اسم الجهاز في Firebase: {$deviceId} -> {$newDeviceName}");
        } else {
            error_log("❌ FirebaseService: فشل تحديث اسم الجهاز في Firebase: {$deviceId}");
        }
        
        return $result;
    }
    
    /**
     * التحقق من حالة الاتصال بـ Firebase
     * 
     * @return bool true إذا كان الاتصال ناجحاً
     */
    public static function testConnection() {
        if (!self::$initialized) {
            return false;
        }
        
        // محاولة جلب البيانات من الجذر
        $test = self::get('');
        return $test !== null;
    }
    
    /**
     * كتابة/تحديث البيانات في Firebase
     * 
     * @param string $path مسار البيانات (مثال: live_location_requests/device123)
     * @param array $data البيانات المراد كتابتها
     * @return bool true إذا تمت الكتابة بنجاح
     */
    public static function put($path, $data) {
        if (!self::$initialized) {
            error_log("❌ FirebaseService: لم يتم تهيئة الخدمة. استدعِ initialize() أولاً.");
            return false;
        }
        
        $url = self::$databaseUrl . '/' . trim($path, '/') . '.json';
        
        // إضافة API key إذا لزم
        if (self::$apiKey) {
            $url .= (strpos($url, '?') !== false ? '&' : '?') . 'key=' . urlencode(self::$apiKey);
        }
        
        try {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
            curl_setopt($ch, CURLOPT_TIMEOUT, 5);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
            curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
            curl_setopt($ch, CURLOPT_FORBID_REUSE, true);
            
            $response = curl_exec($ch);
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            $error = curl_error($ch);
            curl_close($ch);
            
            if ($error) {
                error_log("❌ FirebaseService: خطأ في cURL عند الكتابة: " . $error);
                return false;
            }
            
            if ($httpCode === 200) {
                return true;
            }
            
            error_log("❌ FirebaseService: HTTP Error {$httpCode} عند الكتابة: {$path}");
            return false;
            
        } catch (Exception $e) {
            error_log("❌ FirebaseService: استثناء عند الكتابة: " . $e->getMessage());
            return false;
        }
    }
    
    /**
     * إنشاء طلب Live Location لجهاز معين
     * 
     * @param string $deviceId معرف الجهاز
     * @param int $duration مدة الطلب بالثواني (افتراضي: 60)
     * @return bool true إذا تم إنشاء الطلب بنجاح
     */
    public static function requestLiveLocation($deviceId, $duration = 60) {
        if (empty($deviceId)) {
            return false;
        }
        
        $path = "live_location_requests/{$deviceId}";
        
        // ✅ حذف أي طلب قديم أولاً لضمان بداية نظيفة
        self::delete($path);
        
        // ✅ إنشاء طلب جديد
        $requestId = uniqid('req_', true);
        $now = new DateTime();
        
        // ✅ استخدام UTC للوقت لضمان الدقة
        $nowUtc = new DateTime('now', new DateTimeZone('UTC'));
        
        $requestData = [
            'request_id' => $requestId,
            'status' => 'pending',
            'requested_at' => $nowUtc->format('Y-m-d H:i:s'),
            'requested_at_iso' => $nowUtc->format('c'), // ISO 8601 with timezone
            'duration' => $duration,
            'requested_by' => 'dashboard',
            'created_at' => $nowUtc->format('c')
        ];
        
        error_log("📤 [FirebaseService] Creating live location request for device: $deviceId");
        error_log("📤 [FirebaseService] Request data: " . json_encode($requestData));
        
        return self::put($path, $requestData);
    }
    
    /**
     * إيقاف طلب Live Location لجهاز معين
     * 
     * @param string $deviceId معرف الجهاز
     * @return bool true إذا تم إيقاف الطلب بنجاح
     */
    public static function stopLiveLocation($deviceId) {
        if (empty($deviceId)) {
            return false;
        }
        
        $now = new DateTime();
        
        // ✅ حذف الطلب بالكامل بدلاً من تحديثه إلى completed
        // هذا يضمن أن التطبيق لن يجد طلب قديم
        $path = "live_location_requests/{$deviceId}";
        return self::delete($path);
    }
}

