import { messages } from '../../../core/messages/index.js';
import { createLineLookup, maskGoComments } from '../../../shared/helpers/index.js';
import { criarAnalista } from '../../../types/index.js';
const disableEnv = process.env.TUTANUS_DISABLE_PLUGIN_GO === '1';
function detectUncheckedErrors(src, relPath) {
    const ocorrencias = [];
    const lineOf = createLineLookup(src).lineAt;
    const scan = maskGoComments(src);
    const errorReturningPatterns = [
        /(\w+)\s*:?=\s*(?:os\.|ioutil\.|io\.)\w+\.\w+\(/g,
        /(\w+)\s*:?=\s*(?:json|xml)\.\w+\(/g,
        /(\w+)\s*:?=\s*(?:net\.|http\.)\w+\.\w+\(/g,
        /(\w+)\s*:?=\s*(?:db|sql)\.\w+\(/g,
        /(\w+)\s*:?=\s*exec\.Command\(/g,
        /(\w+)\s*:?=\s*template\.\w+\(/g,
        /(\w+)\s*:?=\s*regexp\.Compile\(/g,
        /(\w+)\s*:?=\s*strconv\.\w+\(/g,
        /(\w+)\s*:?=\s*(?:fmt\.Sprintf|fmt\.Fprintf)\(/g,
    ];
    for (const pattern of errorReturningPatterns) {
        for (const match of scan.matchAll(pattern)) {
            const line = lineOf(match.index);
            const varName = match[1];
            const lineText = scan.split('\n')[line - 1] ?? '';
            const nextLines = scan.split('\n').slice(line, line + 3).join('\n');
            if (/\bif\s+err\s*!=\s*nil/.test(nextLines))
                continue;
            if (varName === 'err' || varName === '_')
                continue;
            if (/err\s*:?=\s*/.test(lineText))
                continue;
            ocorrencias.push({
                relPath,
                mensagem: messages.GoMensagens.uncheckedError,
                linha: line,
                nivel: messages.SeverityNiveis.error,
                origem: 'detector-erros-nao-tratados',
                tipo: 'go/rule'
            });
        }
    }
    for (const match of scan.matchAll(/_\s*=\s*(?:os\.|ioutil\.|io\.|json\.|xml\.|net\.|http\.)\w+\.\w+\(/g)) {
        const line = lineOf(match.index);
        ocorrencias.push({
            relPath,
            mensagem: messages.GoMensagens.ignoredError,
            linha: line,
            nivel: messages.SeverityNiveis.warning,
            origem: 'detector-erros-nao-tratados',
            tipo: 'go/rule'
        });
    }
    return ocorrencias;
}
export const detectorErrosNaoTratados = criarAnalista({
    nome: 'detector-erros-nao-tratados',
    categoria: 'seguranca',
    descricao: 'Detecta chamadas a funções que retornam erro sem tratamento adequado.',
    global: false,
    test: (relPath) => /\.go$/i.test(relPath),
    aplicar: async (src, relPath) => {
        if (disableEnv)
            return null;
        const msgs = detectUncheckedErrors(src, relPath);
        return msgs.length ? msgs : null;
    }
});
//# sourceMappingURL=detector-errors-un-handled.js.map