import { parseDocument } from 'yaml';
import { criarOcorrencia } from '../../../types/index.js';
export const detectorAzureEstrutura = {
    nome: 'detector-azure-estrutura',
    categoria: 'workflows',
    descricao: 'Detecta problemas estruturais em Azure Pipelines',
    test: (relPath) => relPath.includes('azure-pipelines') && /\.(ya?ml)$/i.test(relPath),
    aplicar: (src, relPath) => {
        if (!src)
            return [];
        const ocorrencias = [];
        try {
            const doc = parseDocument(src);
            const pipeline = doc.toJS();
            if (!pipeline)
                return ocorrencias;
            const jobs = pipeline.jobs;
            if (jobs && Array.isArray(jobs)) {
                const jobNames = jobs.map(j => j.job || '').filter(Boolean);
                for (const job of jobs) {
                    if (job.dependsOn && !jobNames.includes(job.dependsOn)) {
                        ocorrencias.push(criarOcorrencia({
                            tipo: 'azure-job-orfao',
                            nivel: 'erro',
                            mensagem: `Job '${job.job || job.displayName}' depende de '${job.dependsOn}' que não existe`,
                            relPath, linha: 1,
                            sugestao: 'Verifique se o nome do job no dependsOn está correto'
                        }));
                    }
                }
                if (jobs.length > 3 && jobs.every(j => !j.dependsOn || jobNames.indexOf(j.dependsOn) === jobNames.indexOf(j.job || '') - 1)) {
                    const hasParallel = jobs.some(j => !j.dependsOn && j !== jobs[0]);
                    if (!hasParallel) {
                        ocorrencias.push(criarOcorrencia({
                            tipo: 'azure-sem-paralelismo',
                            nivel: 'info',
                            mensagem: 'Pipeline com jobs estritamente sequenciais',
                            relPath, linha: 1,
                            sugestao: 'Considere paralelizar jobs independentes'
                        }));
                    }
                }
            }
            const container = pipeline;
            const containers = container.resources?.containers;
            if (containers) {
                for (const c of containers) {
                    if (c.image && /:latest$/i.test(c.image)) {
                        ocorrencias.push(criarOcorrencia({
                            tipo: 'azure-container-latest',
                            nivel: 'aviso',
                            mensagem: `Container '${c.container || c.image}' usa imagem :latest`,
                            relPath, linha: 1,
                            sugestao: 'Fixe a versão da imagem do container'
                        }));
                    }
                }
            }
        }
        catch { }
        return ocorrencias;
    }
};
//# sourceMappingURL=detector-azure-structure.js.map