/**
 * 📡 API Service Module - إدارة اتصالات API
 * يرسل الإحصائيات وسجلات الرسائل إلى السيرفر
 * لا يحظر عملية الإرسال أبداً
 */

const ApiService = {
    // ============================================================
    // الثوابت
    // ============================================================
    API_BASE: 'https://api.codro.me',
    STATS_INTERVAL_MS: 15 * 60 * 1000,       // 15 دقائق
    STATS_MESSAGE_THRESHOLD: 20,             // إرسال stats كل 20 رسالة
    REQUEST_TIMEOUT_MS: 10000,               // 10 ثوانٍ timeout
    MAX_RETRIES: 1,                          // محاولة إعادة واحدة فقط
    DEVICE_ID_KEY: 'device_id',
    LICENSE_KEY_STORAGE: 'wa_license_key',

    // ============================================================
    // الحالة الداخلية
    // ============================================================
    _initialized: false,
    _deviceId: null,
    _licenseKey: null,
    _statsLock: false,
    _statsIntervalId: null,
    _startTime: null,

    // عداد محلي متراكم
    _accumulatedMessagesSent: 0,

    // ============================================================
    // التهيئة
    // ============================================================
    async init() {
        if (this._initialized) return;

        try {
            // 1. تحميل أو إنشاء device_id
            this._deviceId = await this.getDeviceId();

            // 2. قراءة license_key من localStorage
            this._licenseKey = this.getLicenseKey();

            // 3. تسجيل وقت البدء
            this._startTime = Date.now();

            // 4. بدء مؤقت الإحصائيات (كل 5 دقائق)
            this.startStatsInterval();

            this._initialized = true;
            console.log('📡 ApiService initialized | device_id:', this._deviceId ? this._deviceId.substring(0, 8) + '...' : 'N/A');
        } catch (err) {
            console.error('📡 ApiService init error:', err.message);
            // لا نوقف الإضافة بسبب فشل التهيئة
        }
    },

    // ============================================================
    // إنشاء/جلب Device ID (UUID v4)
    // ============================================================
    async getDeviceId() {
        return new Promise((resolve) => {
            chrome.storage.local.get([this.DEVICE_ID_KEY], (result) => {
                if (result[this.DEVICE_ID_KEY]) {
                    resolve(result[this.DEVICE_ID_KEY]);
                } else {
                    // إنشاء UUID v4
                    const uuid = this._generateUUIDv4();
                    chrome.storage.local.set({ [this.DEVICE_ID_KEY]: uuid }, () => {
                        console.log('📡 New device_id generated:', uuid.substring(0, 8) + '...');
                        resolve(uuid);
                    });
                }
            });
        });
    },

    /**
     * توليد UUID v4
     */
    _generateUUIDv4() {
        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
            const r = (Math.random() * 16) | 0;
            const v = c === 'x' ? r : (r & 0x3) | 0x8;
            return v.toString(16);
        });
    },

    // ============================================================
    // جلب License Key من localStorage
    // ============================================================
    getLicenseKey() {
        try {
            return localStorage.getItem(this.LICENSE_KEY_STORAGE) || null;
        } catch (e) {
            return null;
        }
    },

    // ============================================================
    // safePost - fetch مع timeout و retry
    // ============================================================
    async safePost(url, body, retryCount = 0) {
        const controller = new AbortController();
        const timeoutId = setTimeout(() => controller.abort(), this.REQUEST_TIMEOUT_MS);

        try {
            const response = await fetch(url, {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify(body),
                signal: controller.signal
            });

            clearTimeout(timeoutId);

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

            return await response.json();
        } catch (err) {
            clearTimeout(timeoutId);

            // إعادة المحاولة مرة واحدة فقط
            if (retryCount < this.MAX_RETRIES) {
                console.warn(`📡 API retry (${retryCount + 1}/${this.MAX_RETRIES}):`, err.message);
                // انتظار قصير قبل إعادة المحاولة
                await new Promise(r => setTimeout(r, 1000));
                return this.safePost(url, body, retryCount + 1);
            }

            // لا نرمي خطأ - نسجل فقط ونستمر
            console.error('📡 API call failed:', err.message);
            return null;
        }
    },

    // ============================================================
    // إرسال الإحصائيات - /stats
    // ============================================================
    async sendStats() {
        // التحقق من وجود بيانات للإرسال
        if (this._accumulatedMessagesSent === 0) return;

        // قفل المزامنة
        if (this._statsLock) return;
        this._statsLock = true;

        try {
            // تحديث license_key (قد يكون تم تخزينه بعد التهيئة)
            const licenseKey = this.getLicenseKey();
            if (!licenseKey) {
                console.warn('📡 sendStats skipped: no license_key');
                return;
            }

            // حساب وقت التشغيل بالدقائق
            const runtimeMinutes = Math.round((Date.now() - (this._startTime || Date.now())) / 60000);

            // حفظ القيم المحلية قبل الإرسال
            const messagesSent = this._accumulatedMessagesSent;

            // محاولة جلب رقم الواتساب من الدالة العامة
            let whatsappNumber = null;
            try {
                if (typeof getMyWhatsAppNumber === 'function') {
                    whatsappNumber = getMyWhatsAppNumber();
                }
            } catch (e) {
                console.warn('📡 Error calling getMyWhatsAppNumber:', e);
            }

            const payload = {
                license_key: licenseKey,
                whatsapp_number: whatsappNumber,
                messages_sent: messagesSent,
                runtime_minutes: runtimeMinutes,
                device_id: this._deviceId,
                browser_user_agent: navigator.userAgent,
                extension_version: chrome.runtime?.getManifest?.()?.version || '1.0'
            };

            const result = await this.safePost(`${this.API_BASE}/stats`, payload);

            if (result !== null) {
                // نجاح - إعادة تعيين العدادات
                this._accumulatedMessagesSent -= messagesSent;
                if (this._accumulatedMessagesSent < 0) this._accumulatedMessagesSent = 0;
                
                // إعادة تعيين وقت البداية لكي لا يكون الوقت تراكمياً بشكل مضاعف في السيرفر
                this._startTime = Date.now();

                console.log(`📡 Stats sent: ${messagesSent} messages, ${runtimeMinutes} min`);
            }
        } catch (err) {
            console.error('📡 sendStats error:', err.message);
        } finally {
            this._statsLock = false;
        }
    },



    // ============================================================
    // تتبع رسالة ناجحة
    // ============================================================
    trackMessageSent() {
        this._accumulatedMessagesSent++;

        // التحقق من عتبة الإحصائيات (كل 20 رسالة)
        if (this._accumulatedMessagesSent >= this.STATS_MESSAGE_THRESHOLD) {
            this.sendStats();
        }
    },

    // ============================================================
    // بدء مؤقت الإحصائيات الدورية
    // ============================================================
    startStatsInterval() {
        // إيقاف أي مؤقت سابق
        if (this._statsIntervalId) {
            clearInterval(this._statsIntervalId);
        }

        this._statsIntervalId = setInterval(() => {
            this.sendStats();
        }, this.STATS_INTERVAL_MS);
    },

    // ============================================================
    // إرسال كل البيانات المتراكمة (عند انتهاء الحملة)
    // ============================================================
    async flushAll() {
        await this.sendStats();
    }
};
