<?php
/**
 * ✅ سكريبت لمزامنة الأجهزة من Firebase إلى MySQL (محسّن للسرعة)
 * يمكن تشغيله يدوياً أو كـ cron job
 * 
 * الاستخدام:
 * - يدوياً: افتح هذا الملف في المتصفح أو شغله من terminal: php sync_devices_from_firebase.php
 * - تلقائياً: أضفه إلى cron job ليعمل كل ساعة أو يومياً
 */

require_once __DIR__ . '/config.php';
require_once __DIR__ . '/firebase_service.php';

$startTime = microtime(true);

// ✅ التأكد من وجود جدول devices
try {
    $conn->query("SELECT 1 FROM devices LIMIT 1");
} catch (PDOException $e) {
    /** @var PDO $conn */
    $conn->exec("
        CREATE TABLE IF NOT EXISTS `devices` (
          `id` int(11) NOT NULL AUTO_INCREMENT,
          `device_id` varchar(255) NOT NULL,
          `device_name` varchar(255) NOT NULL,
          `first_seen` timestamp DEFAULT CURRENT_TIMESTAMP,
          `last_seen` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
          `status` enum('active','inactive') DEFAULT 'active',
          `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
          `updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
          PRIMARY KEY (`id`),
          UNIQUE KEY `unique_device_id` (`device_id`),
          KEY `idx_device_name` (`device_name`),
          KEY `idx_status` (`status`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    ");
}

// ✅ 1. جلب قائمة device_id من Firebase (سريع جداً)
echo "📱 جلب قائمة الأجهزة من Firebase...\n";
try {
    $firebaseDevices = FirebaseService::getAllDevices(false);
    $firebaseDeviceIds = array_column($firebaseDevices, 'device_id');
} catch (Exception $e) {
    echo "❌ خطأ في جلب الأجهزة من Firebase: " . $e->getMessage() . "\n";
    exit(1);
}

if (empty($firebaseDeviceIds)) {
    echo "✅ لا توجد أجهزة في Firebase\n";
    exit(0);
}

echo "📦 إجمالي الأجهزة في Firebase: " . count($firebaseDeviceIds) . "\n";

// ✅ 3. جلب الأجهزة الموجودة في MySQL (باستخدام IN clause محسّن)
echo "🔍 مقارنة مع MySQL...\n";
$existingDeviceIds = [];
if (count($firebaseDeviceIds) > 0) {
    // ✅ تقسيم إلى batches لتجنب "MySQL server has gone away"
    $batchSize = 500;
    $batches = array_chunk($firebaseDeviceIds, $batchSize);
    
    foreach ($batches as $batch) {
        $placeholders = str_repeat('?,', count($batch) - 1) . '?';
        /** @var PDOStatement $stmtExisting */
        $stmtExisting = $conn->prepare("SELECT device_id FROM devices WHERE device_id IN ($placeholders)");
        $stmtExisting->execute($batch);
        if ($stmtExisting) {
            while (($row = $stmtExisting->fetch(PDO::FETCH_ASSOC)) !== false) {
                if (isset($row['device_id'])) {
                    $existingDeviceIds[] = $row['device_id'];
                }
            }
        }
    }
}

// ✅ 4. تحديد الأجهزة الجديدة فقط
$newDeviceIds = array_diff($firebaseDeviceIds, $existingDeviceIds);

if (empty($newDeviceIds)) {
    $endTime = microtime(true);
    $duration = round($endTime - $startTime, 2);
    echo "✅ جميع الأجهزة موجودة في MySQL.\n";
    echo "⏱️  الوقت المستغرق: {$duration} ثانية\n";
    echo "\n💡 ملاحظة: يمكنك إدارة الأجهزة (إضافة/حذف/تعديل) من صفحة manage_devices.php\n";
    exit(0);
}

echo "🆕 الأجهزة الجديدة: " . count($newDeviceIds) . "\n";
echo "🔄 بدء معالجة الأجهزة...\n\n";

$added = 0;
$skipped = 0;
$deleted = 0; // لم يعد مستخدماً لكن نبقيه لتجنب أخطاء

// ✅ 5. معالجة الأجهزة الجديدة (بدون debug logging للسرعة)
// ✅ معالجة أول 50 جهاز فقط لتسريع العملية
$devicesToProcess = array_slice($newDeviceIds, 0, 50);
echo "📦 معالجة " . count($devicesToProcess) . " جهاز (من " . count($newDeviceIds) . " جهاز جديد)...\n\n";

foreach ($devicesToProcess as $index => $deviceId) {
    // ✅ عرض التقدم كل 10 أجهزة
    if ($index > 0 && $index % 10 == 0) {
        echo "⏳ معالجة الجهاز " . ($index + 1) . " من " . count($devicesToProcess) . "...\n";
    }
    
    // محاولة جلب الاسم من آخر موقع (سريع)
    $deviceName = FirebaseService::getDeviceName($deviceId);
    
    // ✅ إذا فشلت، نجرب آخر 3 أيام فقط (للسرعة)
    if (!$deviceName || $deviceName === 'Unknown Device' || $deviceName === $deviceId) {
        $deviceName = FirebaseService::getDeviceNameFromAnyLocation($deviceId, 3);
    }

    // ✅ إضافة الجهاز حتى لو لم يكن له اسم حقيقي (سيستخدم device_id كاسم)
    if (!$deviceName || $deviceName === 'Unknown Device' || $deviceName === $deviceId) {
        $deviceName = $deviceId; // استخدام device_id كاسم افتراضي
    }

    try {
        $insertStmt = $conn->prepare("
            INSERT INTO devices (device_id, device_name, status) 
            VALUES (?, ?, 'active')
        ");
        $insertStmt->execute([$deviceId, $deviceName]);
        $added++;
    } catch (PDOException $e) {
        $errorMsg = $e->getMessage();
        $errorCode = $e->getCode();
        
        // ✅ إعادة الاتصال إذا انقطع
        if (strpos($errorMsg, 'MySQL server has gone away') !== false || 
            strpos($errorMsg, '2006') !== false ||
            $errorCode == 2006) {
            try {
                DatabaseConnection::resetInstance();
                $dbInstance = DatabaseConnection::getInstance();
                $conn = $dbInstance->getConnection();
                
                $insertStmt = $conn->prepare("
                    INSERT INTO devices (device_id, device_name, status) 
                    VALUES (?, ?, 'active')
                ");
                $insertStmt->execute([$deviceId, $deviceName]);
                $added++;
            } catch (PDOException $e2) {
                $skipped++;
            }
        } else {
            // ✅ إذا كان التكرار، لا نعدّه skipped
            if (strpos($errorMsg, 'Duplicate entry') === false && 
                strpos($errorMsg, '1062') === false &&
                $errorCode != 1062) {
                $skipped++;
            }
        }
    }
}

$endTime = microtime(true);
$duration = round($endTime - $startTime, 2);

echo "\n📊 النتيجة النهائية:\n";
echo "✅ تمت الإضافة: {$added}\n";
echo "⏭️  تم التخطي: {$skipped}\n";
echo "📦 إجمالي الأجهزة الجديدة: " . count($newDeviceIds) . "\n";
echo "⏱️  الوقت المستغرق: {$duration} ثانية\n";
echo "\n💡 ملاحظة: يمكنك إدارة الأجهزة (إضافة/حذف/تعديل) من صفحة manage_devices.php\n";
?>
