import { maskPythonComments, splitLines } from '../../../shared/helpers/index.js';
import { criarOcorrencia } from '../../../types/index.js';
export const detectorPythonBestPractices = {
    nome: 'detector-python-best-practices',
    categoria: 'framework',
    descricao: 'Detecta más práticas em código Python',
    test: (relPath) => /\.(py|pyx|pyi)$/i.test(relPath),
    aplicar: (src, relPath) => {
        if (!src)
            return [];
        const ocorrencias = [];
        const scan = maskPythonComments(src);
        const linhas = splitLines(scan);
        linhas.forEach((linha, index) => {
            const numeroLinha = index + 1;
            if (/^\s*except\s*:/.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'python-bare-except',
                    nivel: 'erro',
                    mensagem: 'Bare except detectado - captura todas exceções incluindo SystemExit',
                    relPath,
                    linha: numeroLinha,
                    sugestao: 'Use except Exception: ou exceção específica'
                }));
            }
            if (/\beval\s*\(/.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'python-eval-usage',
                    nivel: 'erro',
                    mensagem: 'eval() detectado - risco de execução de código arbitrário',
                    relPath,
                    linha: numeroLinha,
                    sugestao: 'Use ast.literal_eval() para dados seguros'
                }));
            }
            if (/\bexec\s*\(/.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'python-exec-usage',
                    nivel: 'erro',
                    mensagem: 'exec() detectado - risco de execução de código arbitrário',
                    relPath,
                    linha: numeroLinha,
                    sugestao: 'Evite exec(), refatore para funções dinâmicas seguras'
                }));
            }
            if (/def\s+\w+\s*\([^)]*=\s*(?:\[|\{)/.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'python-mutable-default',
                    nivel: 'aviso',
                    mensagem: 'Argumento default mutável detectado',
                    relPath,
                    linha: numeroLinha,
                    sugestao: 'Use None como default e inicialize dentro da função'
                }));
            }
            if (/^\s*print\s*\(/.test(linha) && !/^\s*#/.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'python-print-instead-log',
                    nivel: 'info',
                    mensagem: 'print() usado ao invés de logging',
                    relPath,
                    linha: numeroLinha,
                    sugestao: 'Use logging.info(), logging.debug(), etc.'
                }));
            }
            if (/^\s*(?:async\s+)?def\s+\w+\s*\([^)]*\)(?!\s*->)/.test(linha) && !/def\s+(__init__|main|__|setUp|tearDown)/.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'python-missing-type-hints',
                    nivel: 'info',
                    mensagem: 'Função sem type hints',
                    relPath,
                    linha: numeroLinha,
                    sugestao: 'Adicione type hints para parâmetros e retorno'
                }));
            }
            if (/subprocess\.(run|Popen|call).*shell\s*=\s*True/.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'python-subprocess-shell',
                    nivel: 'erro',
                    mensagem: 'subprocess com shell=True - risco de injection',
                    relPath,
                    linha: numeroLinha,
                    sugestao: 'Passe lista de argumentos ao invés de string com shell=True'
                }));
            }
        });
        return ocorrencias;
    }
};
//# sourceMappingURL=detector-python-best-practices.js.map