import fs from 'node:fs';
import path from 'node:path';
import { analistaAzurePipelines } from '../../analysts/azure-pipelines/index.js';
import { ExitCode, sair } from '../helpers/index.js';
import { messages } from '../../core/messages/index.js';
import { Command } from 'commander';
import ora from 'ora';
const log = messages.log;
const msgs = messages.CliComandoAzureMensagens;
function criarSpinnerVazio() {
    return {
        succeed() {
            return this;
        },
        fail() {
            return this;
        },
        stop() { },
        start() {
            return this;
        }
    };
}
function normalizarOcorrencias(result) {
    if (!result)
        return [];
    return Array.isArray(result) ? result : [result];
}
export function comandoAzure() {
    const cmd = new Command('azure').alias('az').description(msgs.descricaoCmd);
    cmd.command('scan').alias('s').description(msgs.descricaoScan).option('-p, --path <caminho>', msgs.optPath, '.').option('-j, --json', 'Saída em JSON').action(async (opts) => {
        const repoPath = path.resolve(opts.path || '.');
        const azureFileRoot = path.join(repoPath, 'azure-pipelines.yml');
        const azureFileAlt = path.join(repoPath, 'azure-pipelines', 'azure-pipelines.yml');
        let azureFile = null;
        let conteudo;
        try {
            conteudo = fs.readFileSync(azureFileRoot, 'utf-8');
            azureFile = azureFileRoot;
        }
        catch {
            try {
                conteudo = fs.readFileSync(azureFileAlt, 'utf-8');
                azureFile = azureFileAlt;
            }
            catch {
                log.erro(msgs.arquivoNaoEncontrado);
                sair(ExitCode.Failure);
                return;
            }
        }
        const spinner = opts.json ? criarSpinnerVazio() : ora({
            text: msgs.analisando,
            spinner: 'dots'
        }).start();
        try {
            const relPath = path.relative(repoPath, azureFile);
            const result = await analistaAzurePipelines.aplicar(conteudo, relPath, null, undefined);
            const ocorrencias = normalizarOcorrencias(result);
            if (opts.json) {
                console.log(JSON.stringify(ocorrencias, null, 2));
            }
            else {
                spinner.succeed(msgs.analiseConcluida(ocorrencias.length));
                if (ocorrencias.length > 0) {
                    console.log('');
                    ocorrencias.forEach((ocorrencia) => {
                        const prefix = ocorrencia.nivel === 'erro' ? '[RED]' : ocorrencia.nivel === 'aviso' ? '[YELLOW]' : '[BLUE]';
                        log.info(msgs.ocorrencia(prefix, ocorrencia.tipo ?? '', ocorrencia.linha ?? 0, ocorrencia.mensagem ?? ''));
                        if (ocorrencia.sugestao)
                            log.info(msgs.sugestao(ocorrencia.sugestao));
                    });
                }
                else {
                    log.sucesso(msgs.boasPraticas);
                }
            }
        }
        catch (err) {
            const msg = err instanceof Error ? err.message : String(err);
            spinner.fail(msgs.erroAnalise(msg));
            sair(ExitCode.Failure);
        }
    });
    return cmd;
}
//# sourceMappingURL=command-azure.js.map