const JavaScriptObfuscator = require('javascript-obfuscator');
const fs = require('fs-extra');
const path = require('path');
const chalk = require('chalk');

// Configurações de ofuscação
const config = {
    compact: true,
    controlFlowFlattening: true,
    controlFlowFlatteningThreshold: 1,
    numbersToExpressions: true,
    simplify: true,
    stringArrayShuffle: true,
    splitStrings: true,
    stringArrayThreshold: 1,
    transformObjectKeys: true,
    unicodeEscapeSequence: false,
    debugProtection: true,
    debugProtectionInterval: 1000,  // Ajustado para 1000ms
    disableConsoleOutput: true,
    identifierNamesGenerator: 'hexadecimal',
    rotateStringArray: true,
    selfDefending: true,
    stringArray: true,
    stringArrayEncoding: ['base64'],
    stringArrayWrappersCount: 2
};

// Arquivos e diretórios a serem protegidos
const filesToProtect = [
    './security/protection.js',
    './Site/**/*.js',
    './admin/**/*.js'
];

// Arquivos a serem excluídos
const excludeFiles = [
    'node_modules',
    'package.json',
    'package-lock.json',
    'obfuscatecpanel.js'
];

async function obfuscateFile(filePath) {
    try {
        const code = await fs.readFile(filePath, 'utf8');
        const obfuscatedCode = JavaScriptObfuscator.obfuscate(code, config).getObfuscatedCode();
        await fs.writeFile(filePath, obfuscatedCode);
        console.log(chalk.green(`✔ Arquivo protegido: ${filePath}`));
    } catch (error) {
        console.error(chalk.red(`✘ Erro ao proteger ${filePath}: ${error.message}`));
    }
}

async function processFiles() {
    console.log(chalk.blue('Iniciando proteção do CPanel...'));
    
    try {
        // Processa cada padrão de arquivo
        for (const pattern of filesToProtect) {
            const files = await fs.glob(pattern, {
                ignore: excludeFiles,
                nodir: true
            });

            for (const file of files) {
                await obfuscateFile(file);
            }
        }

        // Cria ou atualiza o arquivo de domínio
        const domainFile = path.join(__dirname, 'security', 'domain.js');
        const domainCode = `
            (function(){
                const validDomains = [window.location.hostname];
                if (!validDomains.includes(window.location.hostname)) {
                    window.location.href = "blockcomputer.php";
                }
            })();
        `;
        
        const obfuscatedDomainCode = JavaScriptObfuscator.obfuscate(domainCode, config).getObfuscatedCode();
        await fs.writeFile(domainFile, obfuscatedDomainCode);
        console.log(chalk.green('✔ Proteção de domínio atualizada'));

        console.log(chalk.green.bold('\n✨ Proteção concluída com sucesso!'));
        console.log(chalk.yellow('Lembre-se de fazer upload de todos os arquivos para o novo domínio.'));
    } catch (error) {
        console.error(chalk.red(`\n✘ Erro durante o processo: ${error.message}`));
        process.exit(1);
    }
}

processFiles();
