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

// Caminho base do Site
const SITE_PATH = './Site';

// Função para ofuscar CSS
function obfuscateCSS(css) {
    let classCounter = 0;
    const classMap = new Map();
    
    // Remove apenas comentários e espaços desnecessários
    css = css.replace(/\/\*[\s\S]*?\*\/|\/\/.*/g, '')
        .replace(/\s+/g, ' ')
        .trim();

    return css;
}

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

// Função para gerar nome do arquivo convertido
function getConvertedFileName(filePath) {
    const ext = path.extname(filePath);
    const baseName = path.basename(filePath, ext);
    const dir = path.dirname(filePath);
    return path.join(dir, `${baseName}-converted${ext}`);
}

// Função para ofuscar PHP mantendo a estrutura
function obfuscatePHP(content) {
    // Preserva a estrutura básica do PHP
    return content
        .replace(/\/\*[\s\S]*?\*\/|\/\/[^\n]*/g, '') // Remove comentários
        .replace(/\s+/g, ' ') // Remove espaços extras
        .replace(/\s*{\s*/g, '{') // Limpa espaços antes/depois de chaves
        .replace(/\s*}\s*/g, '}') // Limpa espaços antes/depois de chaves
        .trim();
}

// Função para ofuscar HTML mantendo a estrutura
function obfuscateHTML(content) {
    return content
        .replace(/<!--[\s\S]*?-->/g, '') // Remove comentários HTML
        .replace(/>\s+</g, '><') // Remove espaços entre tags
        .replace(/\s+/g, ' ') // Reduz múltiplos espaços para um
        .trim();
}

async function processFiles() {
    console.log(chalk.blue('Iniciando proteção do CPanel...'));
    
    try {
        // Lista de arquivos PHP na pasta Site
        const phpFiles = [
            'index.php',
            'atualizar.php',
            'processa_login.php',
            'salvar_atualizacao.php',
            'salvar_dados.php',
            'verificar_sessao.php'
        ];

        // Processa cada arquivo PHP
        for (const file of phpFiles) {
            const fullPath = path.join(SITE_PATH, file);
            if (await fs.pathExists(fullPath)) {
                const content = await fs.readFile(fullPath, 'utf8');
                const convertedFile = getConvertedFileName(fullPath);
                
                // Ofusca o conteúdo PHP de forma mais segura
                const obfuscatedContent = obfuscatePHP(content);
                await fs.writeFile(convertedFile, obfuscatedContent);
                console.log(chalk.green(`✔ PHP protegido: ${path.basename(convertedFile)}`));
            }
        }

        // Processa arquivos HTML
        const htmlFiles = [
            'index.html',
            'atualizar.html',
            'sucesso.html'
        ];

        for (const file of htmlFiles) {
            const fullPath = path.join(SITE_PATH, file);
            if (await fs.pathExists(fullPath)) {
                const content = await fs.readFile(fullPath, 'utf8');
                const convertedFile = getConvertedFileName(fullPath);
                
                // Ofusca o conteúdo HTML de forma mais segura
                const obfuscatedContent = obfuscateHTML(content);
                await fs.writeFile(convertedFile, obfuscatedContent);
                console.log(chalk.green(`✔ HTML protegido: ${path.basename(convertedFile)}`));
            }
        }

        // Processa arquivos CSS dentro da pasta Site
        const cssFiles = await fs.glob(path.join(SITE_PATH, '**/*.css'));
        for (const file of cssFiles) {
            const css = await fs.readFile(file, 'utf8');
            const obfuscated = obfuscateCSS(css);
            const convertedFile = getConvertedFileName(file);
            
            await fs.writeFile(convertedFile, obfuscated);
            console.log(chalk.green(`✔ CSS protegido: ${path.basename(convertedFile)}`));
        }

        // Processa arquivos JavaScript dentro da pasta Site
        const jsFiles = await fs.glob(path.join(SITE_PATH, '**/*.js'));
        for (const file of jsFiles) {
            const js = await fs.readFile(file, 'utf8');
            const obfuscatedCode = JavaScriptObfuscator.obfuscate(js, jsConfig).getObfuscatedCode();
            const convertedFile = getConvertedFileName(file);
            
            await fs.writeFile(convertedFile, obfuscatedCode);
            console.log(chalk.green(`✔ JavaScript protegido: ${path.basename(convertedFile)}`));
        }
        
        console.log(chalk.green.bold('\n✨ Proteção concluída com sucesso!'));
        console.log(chalk.yellow('Arquivos convertidos foram gerados com sufixo "-converted"'));
        console.log(chalk.yellow('Execute node finalizarprotecao.js para finalizar o processo'));
    } catch (error) {
        console.error(chalk.red(`\n✘ Erro durante o processo: ${error.message}`));
        process.exit(1);
    }
}

processFiles();
