/**
 * نظام محسن لجلب أسماء الأماكن بشكل متوازي وسريع
 * يتضمن تحسينات الأداء والكاش المحلي
 */

class PlacesOptimizer {
    constructor() {
        this.localCache = new Map();
        this.pendingRequests = new Map();
        this.batchSize = 20; // عدد المواقع في كل طلب
        this.batchDelay = 100; // تأخير بين الطلبات بالميلي ثانية
        this.requestQueue = [];
        this.isProcessing = false;
        this.stats = {
            totalRequests: 0,
            cacheHits: 0,
            apiCalls: 0,
            avgResponseTime: 0
        };
    }

    /**
     * جلب أسماء الأماكن بشكل محسن
     */
    async getPlaceNames(locations) {
        const startTime = performance.now();
        
        if (!Array.isArray(locations) || locations.length === 0) {
            return [];
        }

        // إزالة التكرارات وفحص الكاش المحلي
        const { cached, missing } = this.checkLocalCache(locations);
        
        let results = [...cached];
        
        // جلب المواقع المفقودة من الخادم
        if (missing.length > 0) {
            const serverResults = await this.fetchFromServer(missing);
            results = results.concat(serverResults);
        }
        
        // تحديث الإحصائيات
        const responseTime = performance.now() - startTime;
        this.updateStats(locations.length, cached.length, responseTime);
        
        return this.sortResultsByOriginalOrder(locations, results);
    }

    /**
     * فحص الكاش المحلي
     */
    checkLocalCache(locations) {
        const cached = [];
        const missing = [];
        
        for (const location of locations) {
            const key = this.getLocationKey(location.lat, location.lng);
            
            if (this.localCache.has(key)) {
                const cachedData = this.localCache.get(key);
                
                // فحص انتهاء صلاحية الكاش (24 ساعة)
                if (Date.now() - cachedData.timestamp < 24 * 60 * 60 * 1000) {
                    cached.push({
                        lat: location.lat,
                        lng: location.lng,
                        place_name: cachedData.place_name,
                        source: 'local_cache'
                    });
                    continue;
                }
            }
            
            missing.push(location);
        }
        
        return { cached, missing };
    }

    /**
     * جلب البيانات من الخادم بشكل متوازي
     */
    async fetchFromServer(locations) {
        const batches = this.createBatches(locations);
        const allResults = [];
        
        // معالجة المجموعات بشكل متوازي مع تحكم في العدد
        const maxConcurrent = 3; // حد أقصى 3 طلبات متوازية
        
        for (let i = 0; i < batches.length; i += maxConcurrent) {
            const currentBatches = batches.slice(i, i + maxConcurrent);
            
            const batchPromises = currentBatches.map(batch => 
                this.processBatch(batch)
            );
            
            const batchResults = await Promise.all(batchPromises);
            
            // دمج النتائج
            for (const results of batchResults) {
                allResults.push(...results);
            }
            
            // تأخير قصير بين المجموعات
            if (i + maxConcurrent < batches.length) {
                await this.delay(this.batchDelay);
            }
        }
        
        return allResults;
    }

    /**
     * إنشاء مجموعات من المواقع
     */
    createBatches(locations) {
        const batches = [];
        
        for (let i = 0; i < locations.length; i += this.batchSize) {
            batches.push(locations.slice(i, i + this.batchSize));
        }
        
        return batches;
    }

    /**
     * معالجة مجموعة واحدة
     */
    async processBatch(batch) {
        try {
            const response = await fetch('get_places_names_optimized.php', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify({ locations: batch })
            });

            if (!response.ok) {
                throw new Error(`HTTP error! status: ${response.status}`);
            }

            const data = await response.json();
            
            if (!data.success) {
                throw new Error(data.error || 'خطأ في الخادم');
            }

            // حفظ النتائج في الكاش المحلي
            this.cacheResults(data.results);
            
            this.stats.apiCalls++;
            
            return data.results;
            
        } catch (error) {
            console.error('خطأ في معالجة المجموعة:', error);
            
            // إرجاع نتائج افتراضية في حالة الخطأ
            return batch.map(location => ({
                lat: location.lat,
                lng: location.lng,
                place_name: 'خطأ في جلب الموقع',
                source: 'error'
            }));
        }
    }

    /**
     * حفظ النتائج في الكاش المحلي
     */
    cacheResults(results) {
        for (const result of results) {
            if (result.source !== 'error') {
                const key = this.getLocationKey(result.lat, result.lng);
                this.localCache.set(key, {
                    place_name: result.place_name,
                    timestamp: Date.now()
                });
            }
        }
    }

    /**
     * ترتيب النتائج حسب الترتيب الأصلي
     */
    sortResultsByOriginalOrder(originalLocations, results) {
        const resultMap = new Map();
        
        // إنشاء خريطة للنتائج
        for (const result of results) {
            const key = this.getLocationKey(result.lat, result.lng);
            resultMap.set(key, result);
        }
        
        // ترتيب النتائج حسب الترتيب الأصلي
        const sortedResults = [];
        for (const location of originalLocations) {
            const key = this.getLocationKey(location.lat, location.lng);
            const result = resultMap.get(key);
            
            if (result) {
                sortedResults.push(result);
            } else {
                // إضافة نتيجة افتراضية إذا لم توجد
                sortedResults.push({
                    lat: location.lat,
                    lng: location.lng,
                    place_name: 'موقع غير محدد',
                    source: 'fallback'
                });
            }
        }
        
        return sortedResults;
    }

    /**
     * إنشاء مفتاح الموقع
     */
    getLocationKey(lat, lng) {
        return `${parseFloat(lat).toFixed(5)},${parseFloat(lng).toFixed(5)}`;
    }

    /**
     * تأخير
     */
    delay(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }

    /**
     * تحديث الإحصائيات
     */
    updateStats(totalRequests, cacheHits, responseTime) {
        this.stats.totalRequests += totalRequests;
        this.stats.cacheHits += cacheHits;
        
        // حساب متوسط وقت الاستجابة
        if (this.stats.avgResponseTime === 0) {
            this.stats.avgResponseTime = responseTime;
        } else {
            this.stats.avgResponseTime = (this.stats.avgResponseTime + responseTime) / 2;
        }
    }

    /**
     * الحصول على الإحصائيات
     */
    getStats() {
        const cacheHitRate = this.stats.totalRequests > 0 
            ? (this.stats.cacheHits / this.stats.totalRequests * 100).toFixed(1)
            : 0;
            
        return {
            ...this.stats,
            cacheHitRate: `${cacheHitRate}%`,
            avgResponseTime: `${this.stats.avgResponseTime.toFixed(0)}ms`,
            localCacheSize: this.localCache.size
        };
    }

    /**
     * مسح الكاش المحلي
     */
    clearLocalCache() {
        this.localCache.clear();
        console.log('تم مسح الكاش المحلي');
    }

    /**
     * تحسين الكاش (إزالة البيانات المنتهية الصلاحية)
     */
    optimizeCache() {
        const now = Date.now();
        const maxAge = 24 * 60 * 60 * 1000; // 24 ساعة
        
        for (const [key, data] of this.localCache.entries()) {
            if (now - data.timestamp > maxAge) {
                this.localCache.delete(key);
            }
        }
        
        console.log(`تم تحسين الكاش. الحجم الحالي: ${this.localCache.size}`);
    }
}

// إنشاء مثيل عام
const placesOptimizer = new PlacesOptimizer();

// تحسين الكاش كل ساعة
setInterval(() => {
    placesOptimizer.optimizeCache();
}, 60 * 60 * 1000);

// دالة مساعدة للاستخدام السهل
window.getOptimizedPlaceNames = async function(locations) {
    return await placesOptimizer.getPlaceNames(locations);
};

// دالة للحصول على الإحصائيات
window.getPlacesStats = function() {
    return placesOptimizer.getStats();
};

// دالة لمسح الكاش
window.clearPlacesCache = function() {
    placesOptimizer.clearLocalCache();
};

// تصدير للاستخدام كوحدة
if (typeof module !== 'undefined' && module.exports) {
    module.exports = PlacesOptimizer;
}