import { criarOcorrencia } from '../../../types/index.js';
const STAGES_SUGERIDOS = ['Checkout', 'Build', 'Test', 'Deploy'];
export const detectorJenkinsEstrutura = {
    nome: 'detector-jenkins-estrutura',
    categoria: 'workflows',
    descricao: 'Detecta problemas estruturais em Jenkinsfiles',
    test: (relPath) => relPath.toLowerCase().includes('jenkinsfile'),
    aplicar: (src, relPath) => {
        if (!src)
            return [];
        const ocorrencias = [];
        if (!/pipeline\s*\{/i.test(src) && !/node\s*\{/i.test(src)) {
            return ocorrencias;
        }
        if (/pipeline\s*\{/i.test(src)) {
            if (!/agent\s+\{/i.test(src)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'jenkins-sem-agent',
                    nivel: 'erro',
                    mensagem: 'Pipeline declarativo sem bloco agent definido',
                    relPath, linha: 1,
                    sugestao: 'Adicione agent { label \'...\' } ou agent any para definir onde o pipeline executa'
                }));
            }
            if (!/post\s*\{/i.test(src)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'jenkins-sem-post',
                    nivel: 'info',
                    mensagem: 'Pipeline sem bloco post para ações pós-execução',
                    relPath, linha: 1,
                    sugestao: 'Adicione post { always { cleanWs() } } para limpeza do workspace'
                }));
            }
        }
        const stageNames = [];
        const stageRegex = /stage\s*\(\s*['"]([^'"]+)['"]\s*\)/g;
        let match;
        while ((match = stageRegex.exec(src)) !== null) {
            stageNames.push(match[1]);
        }
        if (stageNames.length === 0) {
            return ocorrencias;
        }
        if (stageNames.length <= 1) {
            ocorrencias.push(criarOcorrencia({
                tipo: 'jenkins-poucos-stages',
                nivel: 'info',
                mensagem: 'Pipeline com apenas 1 stage definido',
                relPath, linha: 1,
                sugestao: 'Divida o pipeline em stages (ex: Build, Test, Deploy)'
            }));
        }
        const missingStages = STAGES_SUGERIDOS.filter(s => !stageNames.some(n => n.toLowerCase().includes(s.toLowerCase())));
        if (missingStages.length >= 2 && stageNames.length >= 3) {
            ocorrencias.push(criarOcorrencia({
                tipo: 'jenkins-pipeline-incompleto',
                nivel: 'info',
                mensagem: `Pipeline pode estar faltando stages como: ${missingStages.join(', ')}`,
                relPath, linha: 1,
                sugestao: 'Considere adicionar stages de build, teste e deploy separados'
            }));
        }
        if (!/tools\s*\{/i.test(src) && /pipeline\s*\{/i.test(src)) {
            ocorrencias.push(criarOcorrencia({
                tipo: 'jenkins-sem-tools',
                nivel: 'info',
                mensagem: 'Pipeline sem bloco tools para definir ferramentas (JDK, Maven, Node)',
                relPath, linha: 1,
                sugestao: 'Adicione tools { nodejs \'NodeJS\' } ou tools { jdk \'JDK17\' }'
            }));
        }
        return ocorrencias;
    }
};
//# sourceMappingURL=detector-jenkins-structure.js.map