import { criarOcorrencia } from '../../../types/index.js';
export const detectorWorkflowPerformance = {
    nome: 'detector-workflow-performance',
    categoria: 'workflows',
    descricao: 'Detecta problemas de performance em GitHub Actions',
    test: (relPath) => /\.github\/workflows\/.*\.ya?ml$/i.test(relPath),
    aplicar: (src, relPath) => {
        if (!src)
            return [];
        const ocorrencias = [];
        const linhas = src.split('\n');
        let inJobsSection = false;
        let currentJob = '';
        const jobsWithCheckout = new Map();
        const jobsWithNpmInstall = new Set();
        const jobsWithNpmCi = new Set();
        linhas.forEach((linha, index) => {
            const numeroLinha = index + 1;
            if (/^jobs:\s*$/.test(linha)) {
                inJobsSection = true;
                return;
            }
            if (inJobsSection && /^\w[\w-]*:\s*$/.test(linha) && !linha.startsWith(' ') && !linha.startsWith('\t')) {
                currentJob = linha.trim().replace(':', '');
            }
            if (/\bzips?\s+.*upload-artifact/i.test(src) || /tar\s+.*upload-artifact/i.test(src)) {
                if (!ocorrencias.some(ocorrencia => ocorrencia.tipo === 'workflow-manual-artifact-compression')) {
                    ocorrencias.push(criarOcorrencia({
                        tipo: 'workflow-manual-artifact-compression',
                        nivel: 'info',
                        mensagem: 'Compressão manual de artefato detectada antes de upload',
                        relPath,
                        linha: numeroLinha,
                        sugestao: 'Use actions/upload-artifact@v4 que possui compressão nativa eficiente'
                    }));
                }
            }
            if (/uses:\s*actions\/checkout/.test(linha)) {
                if (currentJob) {
                    jobsWithCheckout.set(currentJob, (jobsWithCheckout.get(currentJob) || 0) + 1);
                }
            }
            if (/\bnpm\s+install\b/.test(linha) && currentJob) {
                jobsWithNpmInstall.add(currentJob);
            }
            if (/\bnpm\s+ci\b/.test(linha) && currentJob) {
                jobsWithNpmCi.add(currentJob);
            }
            if (/matrix:/.test(linha)) {
                const matrixContent = src.slice(src.indexOf(linha));
                const itemsMatch = matrixContent.match(/\[(.*?)\]/g);
                const dimensionCount = (linha.match(/:/g) || []).length;
                if (itemsMatch && itemsMatch.length > 5 || dimensionCount > 3) {
                    ocorrencias.push(criarOcorrencia({
                        tipo: 'workflow-complex-matrix',
                        nivel: 'aviso',
                        mensagem: 'Matrix strategy muito complexa ou grande',
                        relPath,
                        linha: numeroLinha,
                        sugestao: 'Considere simplificar a matrix ou usar jobs separados para clareza'
                    }));
                }
            }
            if (/\b(npm install|curl|wget|apt-get install)\b/.test(linha) && !/retry|continue-on-error/i.test(src)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'workflow-missing-retry',
                    nivel: 'info',
                    mensagem: 'Operação de rede sem política de retry detectada',
                    relPath,
                    linha: numeroLinha,
                    sugestao: 'Adicione mecanismos de retry para evitar falhas intermitentes de rede'
                }));
            }
            if (/\b(mkdir|touch|cp|dd)\b/.test(linha) && !/\b(rm|clean|delete|prune)\b/i.test(src)) {
                if (!ocorrencias.some(ocorrencia => ocorrencia.tipo === 'workflow-missing-cleanup')) {
                    ocorrencias.push(criarOcorrencia({
                        tipo: 'workflow-missing-cleanup',
                        nivel: 'info',
                        mensagem: 'Possível falta de limpeza de arquivos temporários',
                        relPath,
                        linha: numeroLinha,
                        sugestao: 'Adicione um passo de limpeza (cleanup) para evitar consumo excessivo de disco'
                    }));
                }
            }
        });
        let hasRedundantCheckoutInSameJob = false;
        for (const [, count] of jobsWithCheckout) {
            if (count > 1) {
                hasRedundantCheckoutInSameJob = true;
                break;
            }
        }
        if (hasRedundantCheckoutInSameJob) {
            ocorrencias.push(criarOcorrencia({
                tipo: 'workflow-redundant-checkout',
                nivel: 'aviso',
                mensagem: 'Múltiplos checkouts detectados no mesmo job',
                relPath,
                linha: 1,
                sugestao: 'Consolidar steps para evitar múltiplos checkouts no mesmo job'
            }));
        }
        let hasRedundantNpmInstall = false;
        for (const job of jobsWithNpmInstall) {
            if (jobsWithNpmCi.has(job)) {
                hasRedundantNpmInstall = true;
                break;
            }
        }
        if (hasRedundantNpmInstall) {
            ocorrencias.push(criarOcorrencia({
                tipo: 'workflow-redundant-npm-install',
                nivel: 'aviso',
                mensagem: 'Uso de npm install e npm ci no mesmo job',
                relPath,
                linha: 1,
                sugestao: 'Use apenas npm ci para ambientes de CI'
            }));
        }
        return ocorrencias;
    }
};
//# sourceMappingURL=detector-workflow-performance.js.map