import { registroAnalistas } from '../../analysts/registry/index.js';
import { ExitCode, sair } from '../helpers/index.js';
import { chalk, config } from '../../core/config/index.js';
import { iniciarInquisicao } from '../../core/execution/index.js';
import { getMessages } from '../../core/messages/index.js';
import { ICONES_STATUS } from '../../core/messages/shared/index.js';
import { executarShellSeguro } from '../../core/utils/index.js';
import { scanSystemIntegrity } from '../../guardian/index.js';
import { Command } from 'commander';
import { asTecnicas } from '../../types/index.js';
const { log, logSistema, CliAtualizarExtraMensagens } = getMessages();
export function comandoAtualizar(aplicarFlagsGlobais) {
    return new Command('atualizar').description(CliAtualizarExtraMensagens.descricao).option('--global', 'atualiza globalmente via npm i -g').action(async function (opts) {
        try {
            await aplicarFlagsGlobais(this.parent && typeof this.parent.opts === 'function' ? this.parent.opts() : {});
        }
        catch (err) {
            log.erro(CliAtualizarExtraMensagens.falhaAplicarFlags.replace('{erro}', err instanceof Error ? err.message : String(err)));
            sair(ExitCode.Failure);
            return;
        }
        log.info(chalk.bold(CliAtualizarExtraMensagens.iniciandoAtualizacao));
        const baseDir = process.cwd();
        let fileEntries = [];
        try {
            const tecnicas = asTecnicas(registroAnalistas);
            const resultado = await iniciarInquisicao(baseDir, {
                incluirMetadados: false
            }, tecnicas);
            fileEntries = resultado.fileEntries;
            const guardianResultado = await scanSystemIntegrity(fileEntries);
            if (guardianResultado.status === 'ok' || guardianResultado.status === 'baseline-aceito') {
                log.sucesso(CliAtualizarExtraMensagens.guardianIntegridadeValidada.replace('{icone}', ICONES_STATUS.ok));
            }
            else {
                log.aviso(CliAtualizarExtraMensagens.guardianBaselineAlterado);
                log.info(CliAtualizarExtraMensagens.recomendadoGuardianDiff);
            }
            const cmd = opts.global ? 'npm install -g tutanus@latest' : 'npm install tutanus@latest';
            logSistema.atualizacaoExecutando(cmd);
            executarShellSeguro(cmd, {
                stdio: 'inherit'
            });
            logSistema.atualizacaoSucesso();
        }
        catch (err) {
            logSistema.atualizacaoFalha();
            if (typeof err === 'object' && err && 'detalhes' in err && Array.isArray(err.detalhes)) {
                err.detalhes.forEach((diretorio) => {
                    logSistema.atualizacaoDetalhes(diretorio);
                });
            }
            if (config.DEV_MODE)
                log.erro(err instanceof Error ? err.message : String(err));
            sair(ExitCode.Failure);
            return;
        }
    });
}
//# sourceMappingURL=command-update.js.map