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 detectConventions(src, relPath) {
    const ocorrencias = [];
    const lineOf = createLineLookup(src).lineAt;
    const scan = maskGoComments(src);
    for (const match of scan.matchAll(/^func\s+(?:\([^)]*\)\s+)?([a-z]\w*)\s*\(/gm)) {
        const funcName = match[1];
        if (/^[A-Z]/.test(funcName) || /[_-]/.test(funcName))
            continue;
        if (!/^[a-z][a-zA-Z0-9]*$/.test(funcName)) {
            const line = lineOf(match.index);
            ocorrencias.push({
                relPath,
                mensagem: messages.GoMensagens.namingConvention(funcName),
                linha: line,
                nivel: messages.SeverityNiveis.suggestion,
                origem: 'detector-convencoes',
                tipo: 'go/rule'
            });
        }
    }
    for (const match of scan.matchAll(/\b(\w{4,})\s*:=\s*/g)) {
        const line = lineOf(match.index);
        const lineText = scan.split('\n')[line - 1] ?? '';
        if (/index|counter|helper|temp/i.test(match[1]))
            continue;
        if (/^\s*for\b/.test(lineText))
            continue;
        const varName = match[1];
        if (/^[a-z][a-zA-Z0-9]*$/.test(varName) && varName.length > 8) {
            ocorrencias.push({
                relPath,
                mensagem: messages.GoMensagens.longVariableName(varName),
                linha: line,
                nivel: messages.SeverityNiveis.info,
                origem: 'detector-convencoes',
                tipo: 'go/rule'
            });
        }
    }
    for (const match of scan.matchAll(/^import\s+\([^)]+\)/gm)) {
        const block = match[0];
        const lines = block.split('\n');
        for (const impLine of lines) {
            const impMatch = impLine.match(/"([^"]+)"/);
            if (impMatch) {
                const path = impMatch[1];
                if (/\.$/i.test(path)) {
                    const absIdx = (match.index ?? 0) + block.indexOf(impLine);
                    const line = lineOf(absIdx);
                    ocorrencias.push({
                        relPath,
                        mensagem: messages.GoMensagens.incompleteImportPath(path),
                        linha: line,
                        nivel: messages.SeverityNiveis.warning,
                        origem: 'detector-convencoes',
                        tipo: 'go/rule'
                    });
                }
            }
        }
    }
    for (const match of scan.matchAll(/\bfmt\.Errorf\s*\([^)]*\)/g)) {
        const call = match[0];
        const line = lineOf(match.index);
        if (call.includes('%w')) {
            const srcBefore = src.slice(0, match.index);
            const ifMatch = srcBefore.match(/\bif\s+(err|.+err)\s*!=\s*nil[^{]*\{/);
            if (ifMatch) {
                ocorrencias.push({
                    relPath,
                    mensagem: messages.GoMensagens.goodErrorWrapping,
                    linha: line,
                    nivel: messages.SeverityNiveis.info,
                    origem: 'detector-convencoes',
                    tipo: 'go/rule'
                });
            }
        }
    }
    return ocorrencias;
}
export const detectorConvencoes = criarAnalista({
    nome: 'detector-convencoes-go',
    categoria: 'estilo',
    descricao: 'Verifica conformidade com convenções de código Go.',
    global: false,
    test: (relPath) => /\.go$/i.test(relPath),
    aplicar: async (src, relPath) => {
        if (disableEnv)
            return null;
        const msgs = detectConventions(src, relPath);
        return msgs.length ? msgs : null;
    }
});
//# sourceMappingURL=detector-conventions.js.map