/**
 * 🔇 Debug Console Gate — Content Script Context
 * يُعطّل console.log/warn/error لجميع content scripts (panel.js, content.js, etc.)
 * storage.js هو أول ملف في content_scripts لذا يُطبَّق على الكل
 */
(function () {
    const _origLog = console.log.bind(console);
    const _origWarn = console.warn.bind(console);
    const _origError = console.error.bind(console);

    function _isDebug() {
        try { return localStorage.getItem('wa_debug_mode') === 'true'; }
        catch (e) { return false; }
    }

    console.log = function (...args) { if (_isDebug()) _origLog(...args); };
    console.warn = function (...args) { if (_isDebug()) _origWarn(...args); };
    console.error = function (...args) { if (_isDebug()) _origError(...args); };

    console._origLog = _origLog;
    console._origWarn = _origWarn;
    console._origError = _origError;
})();

/**
 *     Storage Manager - إدارة التخزين المحلي
 * يستخدم chrome.storage.local لحفظ البيانات
 */

const StorageManager = {
    // ============================================================
    // الإعدادات الافتراضية
    // ============================================================
    // حالات الحملة الممكنة
    // IDLE | RUNNING | PAUSED | STOPPED | PAUSED_DAILY_LIMIT | COMPLETED
    CAMPAIGN_STATUSES: ['IDLE', 'RUNNING', 'PAUSED', 'STOPPED', 'PAUSED_DAILY_LIMIT', 'COMPLETED'],

    defaults: {
        dailyLimit: 1,
        retryFailed: false,
        enableNotifications: true,
        todayCount: 0,
        todayDate: new Date().toDateString(),
        templates: [],
        failedNumbers: [],
        campaigns: [], // قائمة الحملات المحفوظة
        contactLists: [],
        // === SSOT: حالة الحملة النشطة ===
        campaignStatus: 'IDLE',     // الحالة الحالية
        activeCampaignId: null,     // معرف الحملة النشطة
        campaignStats: {
            totalSent: 0,
            totalFailed: 0,
            lastCampaign: null
        }
    },

    // ============================================================
    // تحميل جميع الإعدادات
    // ============================================================
    async loadAll() {
        return new Promise((resolve) => {
            chrome.storage.local.get(this.defaults, (data) => {
                // إعادة ضبط العداد اليومي إذا تغير التاريخ
                if (data.todayDate !== new Date().toDateString()) {
                    data.todayCount = 0;
                    data.todayDate = new Date().toDateString();
                    this.saveAll(data);
                }
                resolve(data);
            });
        });
    },

    // ============================================================
    // حفظ جميع الإعدادات
    // ============================================================
    async saveAll(data) {
        return new Promise((resolve) => {
            chrome.storage.local.set(data, resolve);
        });
    },

    // ============================================================
    // حفظ/تحميل إعداد محدد
    // ============================================================
    async get(key) {
        const data = await this.loadAll();
        return data[key];
    },

    async set(key, value) {
        const data = await this.loadAll();
        data[key] = value;
        await this.saveAll(data);
    },

    // ============================================================
    // إدارة القوالب
    // ============================================================
    async getTemplates() {
        return await this.get('templates') || [];
    },

    async saveTemplate(name, message) {
        const templates = await this.getTemplates();
        const existing = templates.findIndex(t => t.name === name);

        const template = {
            name: name,
            message: message,
            createdAt: new Date().toISOString()
        };

        if (existing >= 0) {
            templates[existing] = template;
        } else {
            templates.push(template);
        }

        await this.set('templates', templates);
        return templates;
    },

    async deleteTemplate(name) {
        let templates = await this.getTemplates();
        templates = templates.filter(t => t.name !== name);
        await this.set('templates', templates);
        return templates;
    },

    // ============================================================
    // إدارة العداد اليومي
    // ============================================================
    async incrementDailyCount(amount = 1) {
        const data = await this.loadAll();
        data.todayCount += amount;
        await this.saveAll(data);
        return data.todayCount;
    },

    async getDailyCount() {
        const data = await this.loadAll();
        return data.todayCount;
    },

    async canSendMore() {
        const data = await this.loadAll();
        return data.todayCount < data.dailyLimit;
    },

    async getRemainingToday() {
        const data = await this.loadAll();
        return Math.max(0, data.dailyLimit - data.todayCount);
    },

    // ============================================================
    // إدارة الأرقام الفاشلة
    // ============================================================
    async addFailedNumber(phone, error) {
        const failed = await this.get('failedNumbers') || [];
        failed.push({
            phone: phone,
            error: error,
            timestamp: new Date().toISOString()
        });
        await this.set('failedNumbers', failed);
    },

    async getFailedNumbers() {
        return await this.get('failedNumbers') || [];
    },

    async clearFailedNumbers() {
        await this.set('failedNumbers', []);
    },



    async resetAll() {
        return new Promise((resolve) => {
            chrome.storage.local.clear(resolve);
        });
    },

    // ============================================================
    // إدارة الحملات
    // ============================================================

    // جلب جميع الحملات
    async getCampaigns() {
        return await this.get('campaigns') || [];
    },

    // جلب حملة محددة بالمعرف
    async getCampaign(id) {
        const campaigns = await this.getCampaigns();
        return campaigns.find(c => c.id === id) || null;
    },

    // حفظ حملة جديدة أو تحديث موجودة
    async saveCampaign(campaign) {
        const campaigns = await this.getCampaigns();
        const existingIndex = campaigns.findIndex(c => c.id === campaign.id);

        campaign.updatedAt = new Date().toISOString();

        if (existingIndex >= 0) {
            campaigns[existingIndex] = campaign;
        } else {
            campaign.createdAt = new Date().toISOString();
            campaigns.push(campaign);
        }

        await this.set('campaigns', campaigns);
        return campaign;
    },

    // إنشاء حملة جديدة
    async createCampaign(name, message, numbers, mediaFiles = [], mediaCaption = '') {
        const campaign = {
            id: 'campaign_' + Date.now(),
            name: name,
            message: message,
            numbers: numbers,
            sentNumbers: [],
            failedNumbers: [],
            stats: {
                total: numbers.length,
                success: 0,
                failed: 0,
                pending: numbers.length
            },
            status: 'IDLE', // IDLE | RUNNING | PAUSED | STOPPED | PAUSED_DAILY_LIMIT | COMPLETED
            currentIndex: 0,
            createdAt: new Date().toISOString(),
            updatedAt: new Date().toISOString(),
            mediaFiles: mediaFiles,
            mediaCaption: mediaCaption
        };

        return await this.saveCampaign(campaign);
    },

    // حذف حملة
    async deleteCampaign(id) {
        let campaigns = await this.getCampaigns();
        campaigns = campaigns.filter(c => c.id !== id);
        await this.set('campaigns', campaigns);
        return campaigns;
    },

    // تحديث تقدم الحملة
    async updateCampaignProgress(id, updates) {
        const campaign = await this.getCampaign(id);
        if (!campaign) return null;

        Object.assign(campaign, updates);
        campaign.updatedAt = new Date().toISOString();

        // تحديث الإحصائيات
        campaign.stats.success = campaign.sentNumbers.length;
        campaign.stats.failed = campaign.failedNumbers.length;
        campaign.stats.pending = campaign.numbers.length - campaign.sentNumbers.length - campaign.failedNumbers.length;

        // التحقق من اكتمال الحملة
        if (campaign.stats.pending <= 0) {
            campaign.status = 'completed';
        }

        return await this.saveCampaign(campaign);
    },

    // إضافة رقم للأرقام المرسل إليها بنجاح
    async addSentNumber(campaignId, phone) {
        const campaign = await this.getCampaign(campaignId);
        if (!campaign) return null;

        if (!campaign.sentNumbers.includes(phone)) {
            campaign.sentNumbers.push(phone);
            campaign.currentIndex++;
            return await this.updateCampaignProgress(campaignId, campaign);
        }
        return campaign;
    },

    // إضافة رقم للأرقام الفاشلة
    async addCampaignFailedNumber(campaignId, phone, error) {
        const campaign = await this.getCampaign(campaignId);
        if (!campaign) return null;

        const existingFailed = campaign.failedNumbers.find(f => f.phone === phone);
        if (!existingFailed) {
            campaign.failedNumbers.push({
                phone: phone,
                error: error,
                timestamp: new Date().toISOString()
            });
            campaign.currentIndex++;
        }
        return await this.updateCampaignProgress(campaignId, campaign);
    },

    // تغيير حالة الحملة
    async setCampaignStatus(id, status) {
        const campaign = await this.getCampaign(id);
        if (!campaign) return null;

        campaign.status = status;
        return await this.saveCampaign(campaign);
    },

    // جلب الأرقام المتبقية للحملة
    async getRemainingNumbers(campaignId) {
        const campaign = await this.getCampaign(campaignId);
        if (!campaign) return [];

        const sentSet = new Set(campaign.sentNumbers);
        const failedSet = new Set(campaign.failedNumbers.map(f => f.phone));

        return campaign.numbers.filter(num => {
            const phone = num.split(/[,;\t]/)[0].trim().replace(/\D/g, '');
            return !sentSet.has(phone) && !failedSet.has(phone);
        });
    },

    // === SSOT: تحديث حالة الحملة العامة ===
    async setGlobalCampaignStatus(status, campaignId = null) {
        const data = await this.loadAll();
        data.campaignStatus = status;
        if (campaignId !== undefined) {
            data.activeCampaignId = campaignId;
        }
        await this.saveAll(data);
    },

    async getGlobalCampaignStatus() {
        const data = await this.loadAll();
        return {
            status: data.campaignStatus || 'IDLE',
            activeCampaignId: data.activeCampaignId || null
        };
    },

    // جلب الحملة النشطة حالياً
    async getActiveCampaign() {
        const data = await this.loadAll();
        if (!data.activeCampaignId) return null;
        return await this.getCampaign(data.activeCampaignId);
    },

    // ============================================================
    // إدارة قوائم جهات الاتصال (Contact Lists Manager)
    // ============================================================

    // جلب جميع قوائم جهات الاتصال
    async getContactLists() {
        return await this.get('contactLists') || [];
    },

    // جلب قائمة محددة بالمعرف
    async getContactList(listId) {
        const lists = await this.getContactLists();
        return lists.find(l => l.id === listId) || null;
    },

    // إنشاء قائمة جديدة
    async saveContactList(name, contacts) {
        const lists = await this.getContactLists();

        // تنظيف وتنسيق جهات الاتصال
        const cleanedContacts = contacts.map(c => ({
            phone: (c.phone || '').toString().replace(/\D/g, ''),
            name: c.name || '',
            source: c.source || 'manual'
        })).filter(c => c.phone.length >= 10);

        // إزالة التكرارات داخل القائمة الجديدة
        const uniqueContacts = [];
        const phoneSet = new Set();
        for (const contact of cleanedContacts) {
            if (!phoneSet.has(contact.phone)) {
                phoneSet.add(contact.phone);
                uniqueContacts.push(contact);
            }
        }

        const newList = {
            id: 'list_' + Date.now(),
            name: name,
            contacts: uniqueContacts,
            createdAt: new Date().toISOString(),
            updatedAt: new Date().toISOString()
        };

        lists.push(newList);
        await this.set('contactLists', lists);
        return newList;
    },

    // إضافة أرقام لقائمة موجودة مع منع التكرار
    async appendToContactList(listId, newContacts) {
        const lists = await this.getContactLists();
        const listIndex = lists.findIndex(l => l.id === listId);

        if (listIndex === -1) {
            return { success: false, error: typeof t === 'function' ? t('error.listNotFound', 'القائمة غير موجودة') : 'القائمة غير موجودة' };
        }

        const list = lists[listIndex];

        // جمع الأرقام الموجودة في Set للتحقق السريع
        const existingPhones = new Set(list.contacts.map(c => c.phone));

        // تصفية الأرقام الجديدة فقط (منع التكرار)
        let addedCount = 0;
        let duplicateCount = 0;

        for (const contact of newContacts) {
            const phone = (contact.phone || '').toString().replace(/\D/g, '');

            if (phone.length < 10) continue;

            if (existingPhones.has(phone)) {
                duplicateCount++;
            } else {
                existingPhones.add(phone);
                list.contacts.push({
                    phone: phone,
                    name: contact.name || '',
                    source: contact.source || 'manual'
                });
                addedCount++;
            }
        }

        list.updatedAt = new Date().toISOString();
        lists[listIndex] = list;
        await this.set('contactLists', lists);

        return {
            success: true,
            addedCount: addedCount,
            duplicateCount: duplicateCount,
            totalContacts: list.contacts.length
        };
    },

    // تحديث قائمة (الاسم أو المحتوى)
    async updateContactList(listId, updates) {
        const lists = await this.getContactLists();
        const listIndex = lists.findIndex(l => l.id === listId);

        if (listIndex === -1) {
            return null;
        }

        const list = lists[listIndex];

        // تحديث الاسم إذا تم تمريره
        if (updates.name !== undefined) {
            list.name = updates.name;
        }

        // تحديث جهات الاتصال إذا تم تمريرها
        if (updates.contacts !== undefined) {
            list.contacts = updates.contacts;
        }

        list.updatedAt = new Date().toISOString();
        lists[listIndex] = list;
        await this.set('contactLists', lists);

        return list;
    },

    // حذف قائمة
    async deleteContactList(listId) {
        let lists = await this.getContactLists();
        const initialLength = lists.length;
        lists = lists.filter(l => l.id !== listId);

        if (lists.length === initialLength) {
            return { success: false, error: typeof t === 'function' ? t('error.listNotFound', 'القائمة غير موجودة') : 'القائمة غير موجودة' };
        }

        await this.set('contactLists', lists);
        return { success: true };
    }
};

// تصدير للاستخدام العالمي
window.StorageManager = StorageManager;
