import { messages } from '../../../core/messages/index.js';
import { parseDocument } from 'yaml';
import { criarOcorrencia } from '../../../types/index.js';
export const detectorGitLabCIEstrutura = {
    nome: 'detector-gitlab-ci-estrutura',
    categoria: 'workflows',
    descricao: 'Detecta problemas estruturais em GitLab CI pipelines',
    test: (relPath) => relPath.endsWith('.gitlab-ci.yml'),
    aplicar: (src, relPath) => {
        if (!src)
            return [];
        const ocorrencias = [];
        try {
            const doc = parseDocument(src);
            const pipeline = doc.toJS();
            if (!pipeline)
                return ocorrencias;
            const stages = pipeline.stages;
            if (stages && stages.length > 5) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'gitlab-ci-muitos-stages',
                    nivel: 'info',
                    mensagem: messages.AnalistaGitlabCiMensagens.muitosStages(stages.length),
                    relPath, linha: 1,
                    sugestao: 'Considere separar em pipelines independentes ou consolidar stages'
                }));
            }
            if (stages && !stages.includes('test') && !stages.includes('lint')) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'gitlab-ci-sem-test-stage',
                    nivel: 'aviso',
                    mensagem: messages.AnalistaGitlabCiMensagens.semTestStage,
                    relPath, linha: 1,
                    sugestao: 'Adicione um stage de test com jobs de lint, unit tests ou análise estática'
                }));
            }
            const hasNeeds = /needs:/.test(src);
            const jobCount = Object.entries(pipeline).filter(([key, val]) => {
                if (['image', 'services', 'stages', 'types', 'before_script', 'after_script', 'variables', 'cache', 'include', 'workflow', 'default'].includes(key))
                    return false;
                return typeof val === 'object' && val !== null && 'script' in val;
            }).length;
            if (jobCount > 5 && !hasNeeds) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'gitlab-ci-sem-needs',
                    nivel: 'info',
                    mensagem: `${jobCount} jobs sem utilização de needs para otimizar execução`,
                    relPath, linha: 1,
                    sugestao: 'Use needs para definir dependências entre jobs e executar em paralelo quando possível'
                }));
            }
        }
        catch { }
        return ocorrencias;
    }
};
//# sourceMappingURL=detector-gitlab-ci-structure.js.map