import { removerArquivosOrfaos } from '../../analysts/corrections/index.js';
import { registroAnalistas } from '../../analysts/registry/index.js';
import { exportarRelatoriosPoda } from '../handlers/index.js';
import { ExitCode, expandIncludePatterns, processPatternList, sair } from '../helpers/index.js';
import { chalk, config } from '../../core/config/index.js';
import { iniciarInquisicao } from '../../core/execution/index.js';
import { messages } from '../../core/messages/index.js';
import { Command } from 'commander';
import { asTecnicas } from '../../types/index.js';
const { log, logSistema } = messages;
export function comandoPodar(aplicarFlagsGlobais) {
    return new Command('podar').description(messages.CliComandoPodarMensagens.descricao).option('-f, --force', 'Remove arquivos sem confirmação (CUIDADO!)', false).option('--include <padrao>', 'Glob pattern a INCLUIR (pode repetir a flag ou usar vírgulas / espaços para múltiplos)', (val, prev) => {
        prev.push(val);
        return prev;
    }, []).option('--exclude <padrao>', 'Glob pattern a EXCLUIR adicionalmente (pode repetir a flag ou usar vírgulas / espaços)', (val, prev) => {
        prev.push(val);
        return prev;
    }, []).action(async function (opts) {
        try {
            await aplicarFlagsGlobais(this.parent && typeof this.parent.opts === 'function' ? this.parent.opts() : {});
        }
        catch (err) {
            log.erro(`Falha ao aplicar flags: ${err instanceof Error ? err.message : String(err)}`);
            sair(ExitCode.Failure);
            return;
        }
        log.info(chalk.bold(messages.CliComandoPodarMensagens.inicio));
        const baseDir = process.cwd();
        try {
            const includeListRaw = processPatternList(opts.include);
            const includeList = includeListRaw.length ? expandIncludePatterns(includeListRaw) : [];
            const excludeList = processPatternList(opts.exclude);
            if (includeList.length)
                config.CLI_INCLUDE_PATTERNS = includeList;
            if (excludeList.length)
                config.CLI_EXCLUDE_PATTERNS = excludeList;
            const tecnicas = asTecnicas(registroAnalistas);
            const { fileEntries } = await iniciarInquisicao(baseDir, {
                incluirMetadados: false
            }, tecnicas);
            const resultadoPoda = await removerArquivosOrfaos(fileEntries);
            if (resultadoPoda.arquivosOrfaos.length === 0) {
                log.sucesso(messages.CliComandoPodarMensagens.nenhumaSujeira(messages.ICONES_DIAGNOSTICO.sucesso));
                await exportarRelatoriosPoda({
                    baseDir,
                    podados: [],
                    pendentes: [],
                    simulado: !opts.force
                });
                return;
            }
            log.aviso(messages.CliComandoPodarMensagens.orfaosDetectados(resultadoPoda.arquivosOrfaos.length));
            resultadoPoda.arquivosOrfaos.forEach((file) => {
                log.info(messages.CliComandoPodarMensagens.linhaArquivoOrfao(file.arquivo));
            });
            if (!opts.force) {
                const readline = await import('node:readline/promises');
                const rl = readline.createInterface({
                    input: process.stdin,
                    output: process.stdout
                });
                const answer = await rl.question(chalk.yellow(messages.CliComandoPodarMensagens.confirmarRemocao));
                rl.close();
                if (answer.toLowerCase() !== 's') {
                    logSistema.podaCancelada();
                    return;
                }
            }
            if (opts.force) {
                await removerArquivosOrfaos(fileEntries);
                logSistema.podaConcluida();
                const podados = resultadoPoda.arquivosOrfaos.map(arquivo => ({
                    arquivo: arquivo.arquivo,
                    motivo: arquivo.referenciado ? 'inativo' : 'órfão',
                    detectedAt: Date.now(),
                    scheduleAt: Date.now()
                }));
                await exportarRelatoriosPoda({
                    baseDir,
                    podados,
                    pendentes: [],
                    simulado: false
                });
            }
        }
        catch (error) {
            const errMsg = typeof error === 'object' && error && 'message' in error ? error.message : String(error);
            log.erro(messages.CliComandoPodarMensagens.erroDurantePoda(errMsg));
            if (config.DEV_MODE)
                console.error(error);
            sair(ExitCode.Failure);
            return;
        }
    });
}
//# sourceMappingURL=command-prune.js.map