import { config } from '../../core/config/index.js';
const supressaoCache = new Map();
export function limparCacheSupressao() {
    supressaoCache.clear();
}
export function extrairSupressoes(src) {
    if (config.ANALISE_CACHE_ENABLED) {
        const cached = supressaoCache.get(src);
        if (cached)
            return cached;
    }
    const resultado = extrairSupressoesInterno(src);
    if (config.ANALISE_CACHE_ENABLED && src.length < 1_000_000) {
        supressaoCache.set(src, resultado);
    }
    return resultado;
}
function extrairSupressoesInterno(src) {
    const linhas = src.split('\n');
    const porLinha = new Map();
    const blocosAtivos = new Set();
    const normalizarLinha = (linha) => {
        let trimmed = linha.trim();
        if (trimmed.startsWith('<!--'))
            trimmed = trimmed.replace(/^<!--/, '').replace(/--!?>(\s*)?$/, '').trim();
        if (trimmed.startsWith('/*'))
            trimmed = trimmed.replace(/^\/\*/, '').replace(/\*\/$/, '').trim();
        if (trimmed.startsWith('*'))
            trimmed = trimmed.replace(/^\*\s?/, '').trim();
        trimmed = trimmed.replace(/^\/\//, '').trim();
        trimmed = trimmed.replace(/^#/, '').trim();
        trimmed = trimmed.replace(/^--/, '').trim();
        trimmed = trimmed.replace(/^;/, '').trim();
        return trimmed;
    };
    for (let indice = 0; indice < linhas.length; indice++) {
        const linha = linhas[indice];
        const linhaNorm = normalizarLinha(linha);
        const numeroLinha = indice + 1;
        const matchNextLine = linhaNorm.match(/@tutanus-disable-next-line\s+(.+)/);
        if (matchNextLine) {
            const regras = matchNextLine[1].trim().split(/\s+/);
            const linhaAfetada = numeroLinha + 1;
            if (!porLinha.has(linhaAfetada)) {
                porLinha.set(linhaAfetada, new Set());
            }
            regras.forEach(regra => {
                porLinha.get(linhaAfetada)?.add(regra.trim());
            });
            continue;
        }
        const matchDisable = linhaNorm.match(/@tutanus-disable\s+(.+)/);
        if (matchDisable) {
            const regras = matchDisable[1].trim().split(/\s+/);
            regras.forEach(regra => {
                blocosAtivos.add(regra.trim());
            });
            if (!porLinha.has(numeroLinha)) {
                porLinha.set(numeroLinha, new Set());
            }
            regras.forEach(regra => {
                porLinha.get(numeroLinha)?.add(regra.trim());
            });
            continue;
        }
        const matchEnable = linhaNorm.match(/@tutanus-enable\s+(.+)/);
        if (matchEnable) {
            const regras = matchEnable[1].trim().split(/\s+/);
            regras.forEach(regra => {
                blocosAtivos.delete(regra.trim());
            });
            continue;
        }
        if (linhaNorm.includes('@tutanus-disable-all')) {
            blocosAtivos.add('*');
            continue;
        }
        if (linhaNorm.includes('@tutanus-enable-all')) {
            blocosAtivos.clear();
            continue;
        }
        if (blocosAtivos.size > 0) {
            if (!porLinha.has(numeroLinha)) {
                porLinha.set(numeroLinha, new Set());
            }
            blocosAtivos.forEach(regra => {
                porLinha.get(numeroLinha)?.add(regra);
            });
        }
    }
    return {
        porLinha,
        blocosAtivos
    };
}
export function isRegraSuprimida(regra, linha, supressoes) {
    const regrasDaLinha = supressoes.porLinha.get(linha);
    if (!regrasDaLinha) {
        return false;
    }
    if (regrasDaLinha.has(regra)) {
        return true;
    }
    if (regrasDaLinha.has('*')) {
        return true;
    }
    return false;
}
export function filtrarOcorrenciasSuprimidas(ocorrencias, nomeAnalista, src) {
    const supressoes = extrairSupressoes(src);
    return ocorrencias.filter(ocorrencia => {
        if (!ocorrencia.linha) {
            return true;
        }
        const _identificadorRegra = ocorrencia.tipo || nomeAnalista || '';
        const suprimidaPorTipo = ocorrencia.tipo && isRegraSuprimida(ocorrencia.tipo, ocorrencia.linha, supressoes);
        const suprimidaPorAnalista = isRegraSuprimida(nomeAnalista, ocorrencia.linha, supressoes);
        return !suprimidaPorTipo && !suprimidaPorAnalista;
    });
}
//# sourceMappingURL=suppressao.js.map