const AdvancedNameGenerator = require('./nameGenerator');

class AntiStaticAnalysis {
    constructor() {
        this.nameGen = new AdvancedNameGenerator();
    }

    generateDynamicEval() {
        const evalVar = this.nameGen.generateObfuscatedName();
        const constructorVar = this.nameGen.generateObfuscatedName();
        const funcVar = this.nameGen.generateObfuscatedName();
        
        return `
        var ${evalVar} = (function() {
            var ${constructorVar} = 'constru' + 'ctor';
            var ${funcVar} = 'Fun' + 'ction';
            return (function() {}).constructor[${constructorVar}][${funcVar}];
        })();
        
        var dynamicEval = function(code) {
            return ${evalVar}('retu' + 'rn ' + code)();
        };`;
    }

    generateAntiDebugger() {
        const names = {
            check: this.nameGen.generateObfuscatedName(),
            timer: this.nameGen.generateObfuscatedName(),
            action: this.nameGen.generateObfuscatedName(),
            err: this.nameGen.generateObfuscatedName(),
            i: this.nameGen.generateObfuscatedName()
        };
        
        // Несколько вариантов реакции на отладчик
        const reactions = [
            'while(1){}', // Старый добрый бесконечный цикл
            'location.reload()', // Перезагрузка
            `for(var k in window){ try{ if(typeof window[k] === 'object') window[k] = null; } catch(e){} }` // Порча глобальных объектов
        ];
        const selectedReaction = reactions[Math.floor(Math.random() * reactions.length)];

        return `
        var ${names.action} = function() { ${selectedReaction} };
        
        var ${names.check} = function() {
            var ${names.timer} = Date.now();
            (function() { debugger; })();
            if (Date.now() - ${names.timer} > 100) {
                ${names.action}();
            }

            try {
                if (console.log.toString().indexOf('[native code]') === -1) {
                     ${names.action}();
                }
            } catch(${names.err}) {}
            
            try {
                throw new Error();
            } catch (${names.err}) {
                if (${names.err}.stack && ${names.err}.stack.includes('debugger')) {
                     ${names.action}();
                }
            }
        };
        
        if (typeof setInterval !== 'undefined') {
            setInterval(${names.check}, ${Math.floor(Math.random() * 1000) + 500});
        }
        try { ${names.check}(); } catch(e) {}
        `;
    }
    
    // Используем именованную функцию вместо arguments.callee
    generateCodeIntegrityCheck(originalCode) {
        const names = {
            checkFunc: this.nameGen.generateObfuscatedName(),
            hash: this.nameGen.generateObfuscatedName(),
            expected: this.nameGen.generateObfuscatedName(),
            code: this.nameGen.generateObfuscatedName(),
        };
        
        const expectedHash = this.calculateHash(originalCode);
        
        return `
        (function ${names.checkFunc}() {
            var ${names.hash} = 0;
            var ${names.code} = ${names.checkFunc}.toString();
            
            var ${names.expected} = ${expectedHash};
            if (${names.hash} !== ${names.expected}) {
                while(1){}
            }
        })();`;
    }

    calculateHash(str) {
        let hash = 0;
        for (let i = 0; i < str.length; i++) {
            hash = ((hash << 5) - hash + str.charCodeAt(i)) & 0xffffffff;
        }
        return hash;
    }
}

module.exports = AntiStaticAnalysis;
почини код для выполнения с использованием tampermonkey в хроме