<?php
/**
 * نظام تحديث الكاش في الخلفية
 * يعمل على تحديث أسماء الأماكن المخزنة في الكاش بشكل دوري (باستخدام PDO)
 */

require_once __DIR__ . '/config.php';
// من الأفضل أن يكون الكلاس في ملف منفصل، ولكن هذا الحل يعمل حالياً
if (!class_exists('TimelineService')) {
    require_once 'get_device_stops_optimized.php';
}

class CacheBackgroundUpdater {
    private $conn;
    private $timelineService;
    private $logFile; // ملف السجل
    
    public function __construct() {
        global $conn; // استخدام الاتصال العام
        $this->conn = $conn;
        $this->timelineService = new TimelineService($this->conn);
        $this->logFile = __DIR__ . '/logs/cache_updater.log';
        
        // إنشاء مجلد السجلات إذا لم يكن موجوداً
        $logDir = dirname($this->logFile);
        if (!is_dir($logDir)) {
            mkdir($logDir, 0755, true);
        }
    }
    
    /**
     * تسجيل الأحداث
     */
    private function log($message) {
        $timestamp = date('Y-m-d H:i:s');
        $logMessage = "[{$timestamp}] {$message}" . PHP_EOL;
        file_put_contents($this->logFile, $logMessage, FILE_APPEND | LOCK_EX);
    }
    
    /**
     * تحديث الكاش القديم
     */
    public function updateOldCache($hoursOld = 168) { // أسبوع افتراضياً
        try { // تحديث الكاش القديم
            $this->log("بدء تحديث الكاش القديم (أقدم من {$hoursOld} ساعة)");
            
            // جلب السجلات القديمة
            // تم تصحيح أسماء الجدول والأعمدة واستخدام PDO
            $stmt = $this->conn->prepare("
                SELECT lat_rounded, lng_rounded
                FROM places_cache 
                WHERE updated_at < DATE_SUB(NOW(), INTERVAL ? HOUR)
                   OR place_name IS NULL 
                   OR place_name = 'موقع غير محدد'
                ORDER BY access_count DESC, updated_at ASC
                LIMIT 50
            ");
            $stmt->execute([$hoursOld]);
            $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
            
            $locations = [];
            foreach ($results as $row) {
                $locations[] = [
                    'lat' => floatval($row['lat_rounded']),
                    'lng' => floatval($row['lng_rounded'])
                ]; // تجميع المواقع
            }
            
            if (empty($locations)) {
                $this->log("لا توجد سجلات قديمة للتحديث");
                return;
            }
            
            $this->log("تحديث " . count($locations) . " موقع");
            
            // استدعاء الدالة الصحيحة، وهي تقوم بالحفظ في الكاش تلقائياً (من OptimizedPlacesService)
            $updatedPlaces = $this->timelineService->batchGetHighAccuracyPlaceNames($locations);
            
            $updatedCount = 0;
            foreach ($updatedPlaces as $place) {
                if (isset($place['source']) && $place['source'] === 'api') {
                    $updatedCount++;
                }
            }
            
            $this->log("تم تحديث {$updatedCount} سجل من API (الباقي من الكاش)");
            
        } catch (Exception $e) {
            $this->log("خطأ في تحديث الكاش: " . $e->getMessage());
        }
    }
    
    /**
     * تنظيف الكاش القديم جداً
     */
    public function cleanupOldCache($daysOld = 90) {
        try { // تنظيف الكاش القديم
            $this->log("بدء تنظيف الكاش القديم (أقدم من {$daysOld} يوم)");
            
            $stmt = $this->conn->prepare("
                DELETE FROM places_cache 
                WHERE updated_at < DATE_SUB(NOW(), INTERVAL ? DAY)
                  AND access_count < 5
            ");
            $stmt->execute([$daysOld]);
            
            $deletedCount = $stmt->rowCount();
            $this->log("تم حذف {$deletedCount} سجل قديم");
            
        } catch (Exception $e) {
            $this->log("خطأ في تنظيف الكاش: " . $e->getMessage());
        }
    }
    
    /**
     * تحديث إحصائيات الكاش
     */
    public function updateCacheStats() {
        try { // تحديث إحصائيات الكاش
            $this->log("بدء تحديث إحصائيات الكاش");
            // استخدام أسماء الجداول الصحيحة ودوال PDO
            $totalRecords = $this->conn->query("SELECT COUNT(*) as count FROM places_cache")->fetch(PDO::FETCH_ASSOC)['count'];
            $emptyRecords = $this->conn->query("SELECT COUNT(*) as count FROM places_cache WHERE place_name IS NULL OR place_name = 'موقع غير محدد' OR place_name = ''")->fetch(PDO::FETCH_ASSOC)['count'];
            $recentRecords = $this->conn->query("SELECT COUNT(*) as count FROM places_cache WHERE updated_at > DATE_SUB(NOW(), INTERVAL 24 HOUR)")->fetch(PDO::FETCH_ASSOC)['count'];
            
            // جدول الإحصائيات مخصص لطلبات API، لذلك نكتفي بتسجيل هذه المعلومات في السجل
            $this->log("إحصائيات الكاش: المجموع={$totalRecords}, فارغة={$emptyRecords}, حديثة={$recentRecords}");
            
        } catch (Exception $e) {
            $this->log("خطأ في تحديث الإحصائيات: " . $e->getMessage());
        }
    }
    
    /**
     * تشغيل جميع مهام التحديث
     */
    public function runAllTasks() {
        $this->log("=== بدء مهام تحديث الكاش ==="); // تسجيل بداية المهام
        
        $this->updateOldCache(168); // تحديث الكاش الأقدم من أسبوع
        $this->cleanupOldCache(90);  // حذف الكاش الأقدم من 3 شهور
        $this->updateCacheStats();   // تحديث الإحصائيات
        
        $this->log("=== انتهاء مهام تحديث الكاش ===");
    }
}

// تشغيل المحدث إذا تم استدعاء الملف مباشرة
if (php_sapi_name() === 'cli' || (isset($_GET['run']) && $_GET['run'] === 'background')) {
    $updater = new CacheBackgroundUpdater();
    $updater->runAllTasks(); // تشغيل جميع المهام
    
    if (php_sapi_name() === 'cli') {
        echo "تم تشغيل مهام تحديث الكاش بنجاح\n";
    } else {
        echo json_encode(['status' => 'success', 'message' => 'تم تشغيل مهام تحديث الكاش بنجاح']);
    }
}
?>