import { LIMITES_PADRAO } from '../../core/config/index.js';
import { isContextoDocumentacao } from '../index.js';
export function calcularEntropia(str) {
    const frequencias = new Map();
    for (const char of str) {
        frequencias.set(char, (frequencias.get(char) || 0) + 1);
    }
    let entropia = 0;
    for (const freq of frequencias.values()) {
        const prob = freq / str.length;
        entropia -= prob * Math.log2(prob);
    }
    return entropia;
}
export function isPlaceholderSuspeito(linha) {
    const placeholdersComuns = ['<YOUR_', '<FOO>', '<BAR>', 'REPLACE_ME', 'EXAMPLE_', 'PLACEHOLDER', 'your_', 'example', 'sample', 'demo', 'test', 'fake', 'dummy', 'mock'];
    const linhaLower = linha.toLowerCase();
    return placeholdersComuns.some(caminho => linhaLower.includes(caminho.toLowerCase()));
}
export function detectarSegredosHardcoded(src, relPath) {
    if (isContextoDocumentacao(relPath))
        return [];
    const resultados = [];
    const linhas = src.split('\n');
    const padroesNomenclatura = ['_role_', '_config_', '_key_', '_type_', '_name_', '_prefix_', '_suffix_', 'squad_', 'channel_', 'guild_'];
    linhas.forEach((linha, index) => {
        const isNonSecretChave = /\b(migration|cache|hash|dedupe|lookup|map|index)key\b/i.test(linha);
        if (isNonSecretChave || isPlaceholderSuspeito(linha))
            return;
        const padraoSegredo = /\b(password|pwd|pass|secret|key|token|api_key|apikey)\b\s*[:=]\s*['"`]([^'"`\s]{3,})/i;
        const match = linha.match(padraoSegredo);
        if (match) {
            const campo = String(match[1] || '').toLowerCase();
            const valor = match[2];
            if (linha.includes('${') || /`[^`]*\$\{[^}]+\}/.test(linha))
                return;
            if (padroesNomenclatura.some(caminho => valor.toLowerCase().includes(caminho.toLowerCase())))
                return;
            const entropia = calcularEntropia(valor);
            const temAltaEntropia = entropia > LIMITES_PADRAO.SEGURANCA.ENTROPIA_SHANNON_ALTA;
            if (valor.length > 20 && temAltaEntropia) {
                resultados.push({
                    campo,
                    valor,
                    linha: index + 1,
                    confianca: 'alta'
                });
            }
            else if (valor.length > 8 && temAltaEntropia) {
                resultados.push({
                    campo,
                    valor,
                    linha: index + 1,
                    confianca: 'media'
                });
            }
        }
    });
    return resultados;
}
export function detectarComentariosPendentes(src) {
    const resultados = [];
    const linhas = src.split('\n');
    linhas.forEach((linha, index) => {
        const match = linha.match(/\/\/\s*(TODO|FIXME)[:\s]*(.*)/i) || linha.match(/\/\*\s*(TODO|FIXME)[:\s]*(.*)\*\//i);
        if (match) {
            const tipoValor = match[1].toUpperCase();
            const tipo = tipoValor === 'TODO' || tipoValor === 'FIXME' ? tipoValor : 'TODO';
            resultados.push({
                tipo,
                linha: index + 1,
                texto: match[2].trim()
            });
        }
    });
    return resultados;
}
export function detectarLogsDebug(src) {
    const resultados = [];
    const linhas = src.split('\n');
    linhas.forEach((linha, index) => {
        const match = linha.match(/console\.(log|debug|info|warn|error)\s*\(/);
        if (match && !linha.trim().startsWith('//')) {
            resultados.push({
                linha: index + 1,
                metodo: match[1]
            });
        }
    });
    return resultados;
}
//# sourceMappingURL=detectors-common.js.map