import { messages } from '../../../core/messages/index.js';
import { createLineLookup, maskRustComments } from '../../../shared/helpers/index.js';
import { criarAnalista } from '../../../types/index.js';
const disableEnv = process.env.TUTANUS_DISABLE_PLUGIN_RUST === '1';
function detectConventions(src, relPath) {
    const ocorrencias = [];
    const lineOf = createLineLookup(src).lineAt;
    const scan = maskRustComments(src);
    for (const match of scan.matchAll(/^\s*pub\s+fn\s+(\w+)/gm)) {
        const fnName = match[1];
        const srcBefore = src.slice(0, match.index);
        const fnLineStart = srcBefore.lastIndexOf('\n') + 1;
        const precedingText = src.slice(Math.max(0, fnLineStart - 300), fnLineStart);
        const hasDoc = /^\s*\/\/\/|^\s*\/\*!|#\[doc\(/m.test(precedingText);
        if (!hasDoc) {
            const line = lineOf(match.index);
            ocorrencias.push({
                relPath,
                mensagem: messages.RustMensagens.missingDoc(fnName),
                linha: line,
                nivel: messages.SeverityNiveis.suggestion,
                origem: 'detector-convencoes',
                tipo: 'rust/rule'
            });
        }
    }
    for (const match of scan.matchAll(/^\s*(?:pub\s+)?(?:const)\s+(\w+)\s*:/gm)) {
        const constName = match[1];
        if (/[a-z]/.test(constName)) {
            const line = lineOf(match.index);
            ocorrencias.push({
                relPath,
                mensagem: messages.RustMensagens.namingConvention(constName),
                linha: line,
                nivel: messages.SeverityNiveis.suggestion,
                origem: 'detector-convencoes',
                tipo: 'rust/rule'
            });
        }
    }
    for (const match of scan.matchAll(/\breturn\s+(\w[\w!]*)\s*;$/gm)) {
        const line = lineOf(match.index);
        const fnContext = src.slice(0, match.index).match(/\bfn\s+\w+\s*\(/g);
        if (fnContext) {
            const lineText = src.split('\n')[line - 1]?.trim() ?? '';
            if (lineText.startsWith('return ') && !lineText.includes('return if') && !lineText.includes('return match')) {
                ocorrencias.push({
                    relPath,
                    mensagem: messages.RustMensagens.redundantReturn,
                    linha: line,
                    nivel: messages.SeverityNiveis.suggestion,
                    origem: 'detector-convencoes',
                    tipo: 'rust/rule'
                });
            }
        }
    }
    for (const match of scan.matchAll(/\buse\s+(?:\w+::)+\*\s*;/g)) {
        const line = lineOf(match.index);
        const importPath = match[0].replace('use ', '').replace(';', '');
        ocorrencias.push({
            relPath,
            mensagem: messages.RustMensagens.wildcardImport(importPath),
            linha: line,
            nivel: messages.SeverityNiveis.suggestion,
            origem: 'detector-convencoes',
            tipo: 'rust/rule'
        });
    }
    return ocorrencias;
}
export const detectorConvencoes = criarAnalista({
    nome: 'detector-convencoes-rust',
    categoria: 'estilo',
    descricao: 'Verifica conformidade com convenções de código Rust.',
    global: false,
    test: (relPath) => /\.(rs)$/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