/**
 * 🧠 WA Humanizer Engine
 * يحتوي على 3 محركات لمحاكاة السلوك البشري وحماية الحساب
 */

// 🔇 إعادة تطبيق Debug Gate داخل humanizer.js
(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); };
})();

const Humanizer = {

    // ============================================================
    // 1️⃣ Typing Time Algorithm Module (محرك وقت الكتابة)
    // ============================================================
    TypingEngine: {
        calculate: function (messageText, sentCount) {
            const L = messageText.length;
            const W = messageText.split(" ").length;
            const specialChars = (messageText.match(/[!?,.]/g) || []).length;

            // 1. سرعة الكتابة الأساسية (3.2 إلى 5.8 حرف في الثانية)
            // كلما زاد الطول، زادت السرعة قليلاً (Sustained speed)
            const baseSpeed = this.random(4, 10);

            // 2. معامل الإرهاق (Fatigue Factor)
            // يزداد التبطؤ كلما زاد عدد الرسائل المرسلة
            const fatigueFactor = 1 + (sentCount * this.random(0.010, 0.02));

            // 3. وقت الكتابة الصافي
            const typingTimeMs = ((L / baseSpeed) * 1000) * fatigueFactor;

            // 4. وقت القراءة (قبل البدء في الكتابة)
            const readTimeMs = this.random(1000, 3000);

            // 5. وقت التفكير (يعتمد على تعقيد الرسالة)
            let thinkingTimeMs = this.random(300, 3000) + (L * 10);
            thinkingTimeMs = Math.max(800, Math.min(thinkingTimeMs, 4000)); // Clamp between 1.2s and 6s

            // 6. تردد ما قبل الإرسال (Hesitation)
            const sendPauseMs = this.random(200, 800);

            // المجموع الكلي
            const totalDelayMs = readTimeMs + thinkingTimeMs + typingTimeMs + sendPauseMs;

            return {
                totalDelayMs: Math.floor(totalDelayMs),
                breakdown: {
                    readTimeMs: Math.floor(readTimeMs),
                    thinkingTimeMs: Math.floor(thinkingTimeMs),
                    typingTimeMs: Math.floor(typingTimeMs),
                    sendPauseMs: Math.floor(sendPauseMs)
                }
            };
        },

        random: function (min, max) {
            return Math.random() * (max - min) + min;
        }
    },

    // ============================================================
    // 2️⃣ Smart Delay Engine (متحكم التوقيت العالمي)
    // ============================================================
    DelayEngine: {
        calculate: function (userDelaySeconds, typingTimeMs, sentCount, lastErrorCount) {
            const userDelayMs = userDelaySeconds * 1000;
            const minSafeDelay = this.random(4000, 5000);
            const maxSafeDelay = this.random(15000, 30000);

            // 1. التوقيت الأساسي
            let finalDelay = Math.max(userDelayMs, typingTimeMs);

            // 2. إضافة التباين (Variance)
            const variance = 1 + this.random(0.1, 0.3);
            finalDelay = finalDelay * variance;

            // 3. تطبيق الحد الأدنى
            if (finalDelay < minSafeDelay) finalDelay = minSafeDelay;

            // 4. التعامل مع الأخطاء (Slow Down Protocol)
            if (lastErrorCount >= 2) {
                const errorPenalty = this.random(1.2, 2.0);
                finalDelay = finalDelay * errorPenalty;
            }

            let reason = "Standard Pace";

            // 🔴 التعديل هنا: تطبيق سقف الإرسال (Max Cap) قبل الاستراحة الطويلة
            if (finalDelay > maxSafeDelay) {
                finalDelay = maxSafeDelay;
                reason += " (Max Cap Reached)";
            }

            // 🟢 5. الاستراحة الطويلة (تتم إضافتها الآن وتتجاوز السقف بنجاح)
            const longPauseInterval = Math.floor(this.random(7, 15));
            if (sentCount > 0 && sentCount % longPauseInterval === 0) {
                const longPause = this.random(30000, 90000); // 30s to 90s
                finalDelay += longPause; // ستتجاوز الـ maxSafeDelay لأنها تُجمع بعده
                reason = "💤 Long Human Pause (Coffee Break)";
            }

            return {
                finalDelayMs: Math.floor(finalDelay),
                reason: reason
            };
        },

        random: function (min, max) {
            return Math.random() * (max - min) + min;
        }
    },

    // ============================================================
    // 3️⃣ Enhanced Message Variants Engine (مولد التنويعات المحسّن)
    // ============================================================
    VariantEngine: {
        process: function (originalMessage, variantLevel = "medium") {
            let msg = originalMessage;
            let changes = [];

            // 1. المسافات المخفية (Zero Width Space) - دائماً مفعّل
            // أقوى تقنية لتغيير الـ Hash بدون تغيير الشكل
            const zwsp = "\u200B";  // Zero Width Space
            const zwnj = "\u200C";  // Zero Width Non-Joiner
            const zwj = "\u200D";   // Zero Width Joiner

            // إدراج 2-5 أحرف مخفية في مواقع عشوائية
            const invisibleChars = [zwsp, zwnj, zwj];
            const insertions = Math.floor(this.random(2, 5));

            for (let i = 0; i < insertions; i++) {
                const char = invisibleChars[Math.floor(Math.random() * invisibleChars.length)];
                const position = Math.floor(Math.random() * msg.length);
                msg = msg.slice(0, position) + char + msg.slice(position);
            }
            changes.push(`${insertions} Invisible Chars`);

            // 2. تنويع المسافات الظاهرة
            const spaceVariant = Math.random();
            if (spaceVariant > 0.7) {
                msg = msg + " "; // مسافة في النهاية
                changes.push("Trailing Space");
            } else if (spaceVariant > 0.5) {
                msg = " " + msg; // مسافة في البداية
                changes.push("Leading Space");
            } else if (spaceVariant > 0.3) {
                msg = msg + "  "; // مسافتين في النهاية
                changes.push("Double Trailing Space");
            }

            // 3. إضافة سطر فارغ عشوائي (أحياناً)
            if (Math.random() > 0.8) {
                if (Math.random() > 0.5) {
                    msg = "\n" + msg;
                    changes.push("Leading Newline");
                } else {
                    msg = msg + "\n";
                    changes.push("Trailing Newline");
                }
            }

            // 4. تنويع علامات الترقيم
            if (variantLevel === "medium" || variantLevel === "high") {
                if (msg.endsWith("!") && Math.random() > 0.6) {
                    msg = msg + "!"; // !!
                    changes.push("Double Exclamation");
                } else if (msg.endsWith(".") && Math.random() > 0.5) {
                    msg = msg.slice(0, -1); // إزالة النقطة
                    changes.push("Removed Dot");
                } else if (msg.endsWith("؟") && Math.random() > 0.6) {
                    msg = msg + "؟"; // ؟؟
                    changes.push("Double Question");
                }
            }

            // 5. إضافة إيموجي مخفي (نادر جداً)
            if (variantLevel === "high" && Math.random() > 0.9) {
                const hiddenEmojis = ["\uFE0F", "\u200D"]; // Variation Selector
                msg = msg + hiddenEmojis[Math.floor(Math.random() * hiddenEmojis.length)];
                changes.push("Hidden Emoji Modifier");
            }

            console.log(`🔄 Variant applied: ${changes.join(", ")}`);

            return {
                finalMessage: msg,
                variantApplied: changes
            };
        },

        random: function (min, max) {
            return Math.random() * (max - min) + min;
        }
    }
};

// إتاحة الكائن عالمياً
window.Humanizer = Humanizer;
console.log("🧠 Humanizer Engine Loaded");