import { accessSync } from 'node:fs';
import { resolve, sep } from 'node:path';
import { listarFormatters, registrarFormatter, removerFormatter } from '../../core/formatters/index.js';
import { getMessages } from '../../core/messages/index.js';
import { Command } from 'commander';
const { log, FormattersMensagens } = getMessages();
export function comandoFormatters() {
    const cmd = new Command('formatters')
        .description(FormattersMensagens.descricao);
    cmd.command('list')
        .description(FormattersMensagens.listDescricao)
        .option('--json', 'Saída em formato JSON')
        .action((opts) => {
        const formatters = listarFormatters();
        if (opts.json) {
            console.log(JSON.stringify(formatters, null, 2));
            return;
        }
        log.info(FormattersMensagens.formatadoresRegistrados);
        if (formatters.length === 0) {
            log.info(FormattersMensagens.nenhumFormatador);
            return;
        }
        for (const f of formatters) {
            log.info(FormattersMensagens.linhaFormatador(f.nome, f.formato, f.descricao));
            if (f.extensoes && f.extensoes.length > 0) {
                log.info(FormattersMensagens.extensoesFormatador(f.extensoes.join(', ')));
            }
        }
    });
    cmd.command('register <nome>')
        .description(FormattersMensagens.registerDescricao)
        .argument('<caminho>', 'Caminho do módulo do formatador')
        .action(async (nome, caminho) => {
        try {
            if (!caminho.startsWith('./') && !caminho.startsWith('../') && !caminho.startsWith('/') && !caminho.startsWith(`.${sep}`)) {
                log.erro(FormattersMensagens.moduloInvalido(caminho));
                return;
            }
            const caminhoResolvido = resolve(caminho);
            try {
                accessSync(caminhoResolvido);
            }
            catch {
                log.erro(FormattersMensagens.moduloInvalido(caminho));
                return;
            }
            const mod = await import(caminhoResolvido);
            if (!mod.default || typeof mod.default.gerar !== 'function') {
                log.erro(FormattersMensagens.moduloInvalido(caminho));
                return;
            }
            const formatter = { nome, ...mod.default };
            registrarFormatter(formatter);
            log.sucesso(FormattersMensagens.formatadorRegistrado(nome));
        }
        catch (err) {
            log.erro(`${FormattersMensagens.semDados}: ${err instanceof Error ? err.message : String(err)}`);
        }
    });
    cmd.command('remove <nome>')
        .description(FormattersMensagens.removeDescricao)
        .action((nome) => {
        if (removerFormatter(nome)) {
            log.sucesso(FormattersMensagens.formatadorRemovido(nome));
        }
        else {
            log.erro(FormattersMensagens.formatadorNaoEncontrado(nome));
        }
    });
    return cmd;
}
//# sourceMappingURL=command-formatters.js.map