import fs from 'node:fs';
import path from 'node:path';
import { analistaGitLabCI } from '../../analysts/gitlab-ci/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.CliComandoGitlabCiMensagens;
function normalizarOcorrencias(result) {
    if (!result)
        return [];
    return Array.isArray(result) ? result : [result];
}
export function comandoGitlabCI() {
    const cmd = new Command('gitlab-ci').alias('gl').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 gitlabFile = path.join(repoPath, '.gitlab-ci.yml');
        let conteudo;
        try {
            conteudo = fs.readFileSync(gitlabFile, 'utf-8');
        }
        catch {
            log.erro(msgs.arquivoNaoEncontrado);
            sair(ExitCode.Failure);
            return;
        }
        const spinner = opts.json ? {
            text: '',
            start() {
                return this;
            },
            succeed() {
                return this;
            },
            fail() {
                return this;
            },
            stop() {
                return this;
            }
        } : ora({
            text: msgs.analisando,
            spinner: 'dots'
        }).start();
        try {
            const relPath = '.gitlab-ci.yml';
            const result = await analistaGitLabCI.aplicar(conteudo, relPath, null, undefined, {
                arquivos: [{
                        relPath,
                        content: conteudo
                    }]
            });
            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-gitlab-ci.js.map