<?php
/**
 * ملف تحسين جدول places_cache لتسريع عمليات جلب أسماء الأماكن
 * يجب تشغيل هذا الملف مرة واحدة لتطبيق التحسينات
 */

require_once 'config.php';

try {
    echo "بدء تحسين جدول places_cache...\n";
    
    // 1. إنشاء جدول محسن جديد
    $conn->exec("
        CREATE TABLE IF NOT EXISTS `places_cache_optimized` (
          `id` INT AUTO_INCREMENT PRIMARY KEY,
          `lat_rounded` DECIMAL(8, 5) NOT NULL COMMENT 'خط العرض مقرب لـ 5 خانات',
          `lng_rounded` DECIMAL(8, 5) NOT NULL COMMENT 'خط الطول مقرب لـ 5 خانات',
          `place_name` VARCHAR(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
          `place_name_short` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'اسم مختصر للمكان',
          `confidence_score` TINYINT DEFAULT 100 COMMENT 'درجة الثقة في اسم المكان',
          `source` ENUM('nominatim', 'google', 'manual') DEFAULT 'nominatim' COMMENT 'مصدر البيانات',
          `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
          `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
          `access_count` INT DEFAULT 1 COMMENT 'عدد مرات الوصول للتحكم في الأولوية',
          `last_accessed` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
          UNIQUE KEY `lat_lng_unique` (`lat_rounded`, `lng_rounded`),
          INDEX `idx_location_lookup` (`lat_rounded`, `lng_rounded`),
          INDEX `idx_access_frequency` (`access_count` DESC, `last_accessed` DESC),
          INDEX `idx_confidence` (`confidence_score` DESC),
          INDEX `idx_created_at` (`created_at` DESC)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
        COMMENT='جدول محسن لتخزين أسماء الأماكن مع فهارس متقدمة'
    ");
    
    echo "تم إنشاء الجدول المحسن بنجاح.\n";
    
    // 2. نقل البيانات من الجدول القديم إلى الجديد (إذا كان موجوداً)
    $oldTableExists = false;
    try {
        $result = $conn->query("SELECT COUNT(*) FROM places_cache LIMIT 1");
        $oldTableExists = true;
        echo "تم العثور على الجدول القديم، سيتم نقل البيانات...\n";
    } catch (PDOException $e) {
        echo "لا يوجد جدول قديم، سيتم البدء بجدول فارغ.\n";
    }
    
    if ($oldTableExists) {
        // نقل البيانات مع تحسينات
        $conn->exec("
            INSERT IGNORE INTO places_cache_optimized 
            (lat_rounded, lng_rounded, place_name, place_name_short, created_at, access_count)
            SELECT 
                ROUND(lat, 5) as lat_rounded,
                ROUND(lng, 5) as lng_rounded,
                place_name,
                SUBSTRING(place_name, 1, 200) as place_name_short,
                created_at,
                1 as access_count
            FROM places_cache
        ");
        
        $transferred = $conn->lastInsertId();
        echo "تم نقل البيانات من الجدول القديم بنجاح.\n";
        
        // إعادة تسمية الجداول
        $conn->exec("RENAME TABLE places_cache TO places_cache_backup");
        $conn->exec("RENAME TABLE places_cache_optimized TO places_cache");
        
        echo "تم استبدال الجدول القديم بالجدول المحسن.\n";
        echo "يمكنك حذف جدول places_cache_backup بعد التأكد من عمل النظام بشكل صحيح.\n";
    } else {
        // إعادة تسمية الجدول الجديد
        $conn->exec("RENAME TABLE places_cache_optimized TO places_cache");
        echo "تم إنشاء جدول places_cache محسن جديد.\n";
    }
    
    // 3. إنشاء جدول إحصائيات الأداء
    $conn->exec("
        CREATE TABLE IF NOT EXISTS `places_cache_stats` (
          `id` INT AUTO_INCREMENT PRIMARY KEY,
          `date` DATE NOT NULL,
          `total_requests` INT DEFAULT 0,
          `cache_hits` INT DEFAULT 0,
          `cache_misses` INT DEFAULT 0,
          `api_calls` INT DEFAULT 0,
          `avg_response_time` DECIMAL(5,3) DEFAULT 0,
          `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
          UNIQUE KEY `date_unique` (`date`),
          INDEX `idx_date` (`date` DESC)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
        COMMENT='إحصائيات أداء نظام الكاش'
    ");
    
    echo "تم إنشاء جدول الإحصائيات بنجاح.\n";
    
    // 4. إنشاء جدول طوابير المعالجة
    $conn->exec("
        CREATE TABLE IF NOT EXISTS `places_queue` (
          `id` INT AUTO_INCREMENT PRIMARY KEY,
          `lat` DECIMAL(8, 5) NOT NULL,
          `lng` DECIMAL(8, 5) NOT NULL,
          `priority` TINYINT DEFAULT 5 COMMENT 'أولوية المعالجة (1-10)',
          `status` ENUM('pending', 'processing', 'completed', 'failed') DEFAULT 'pending',
          `retry_count` TINYINT DEFAULT 0,
          `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
          `processed_at` TIMESTAMP NULL,
          INDEX `idx_status_priority` (`status`, `priority` DESC),
          INDEX `idx_location` (`lat`, `lng`),
          INDEX `idx_created_at` (`created_at`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
        COMMENT='طابور معالجة أسماء الأماكن في الخلفية'
    ");
    
    echo "تم إنشاء جدول الطوابير بنجاح.\n";
    
    echo "\n✅ تم تحسين قاعدة البيانات بنجاح!\n";
    echo "التحسينات المطبقة:\n";
    echo "- فهارس محسنة للبحث السريع\n";
    echo "- تقريب الإحداثيات لتحسين الكاش\n";
    echo "- نظام إحصائيات الأداء\n";
    echo "- نظام طوابير المعالجة في الخلفية\n";
    echo "- تحسين أنواع البيانات وأحجام الحقول\n";
    
} catch (PDOException $e) {
    echo "❌ خطأ في تحسين قاعدة البيانات: " . $e->getMessage() . "\n";
    exit(1);
}
?>