import path from 'node:path';
import { ExitCode, sair } from '../helpers/index.js';
import { config, formatMs } from '../../core/config/index.js';
import { messages } from '../../core/messages/index.js';
import { lerEstado, salvarEstado } from '../../shared/persistence/index.js';
import { Command } from 'commander';
const { log, logMetricas } = messages;
const formatarDuracao = (ms) => formatMs(ms);
function agregados(historico) {
    if (!historico.length)
        return null;
    const total = historico.length;
    const somaAnalise = historico.reduce((acc, hash) => acc + (hash.tempoAnaliseMs ?? 0), 0);
    const somaParsing = historico.reduce((acc, hash) => acc + (hash.tempoParsingMs ?? 0), 0);
    const analistasMap = new Map();
    for (const hash of historico) {
        if (!hash.analistas)
            continue;
        for (const arquivo of hash.analistas) {
            const dado = analistasMap.get(arquivo.nome) || {
                totalMs: 0,
                execucoes: 0,
                ocorrencias: 0
            };
            dado.totalMs += arquivo.duracaoMs;
            dado.execucoes += 1;
            dado.ocorrencias += arquivo.ocorrencias;
            analistasMap.set(arquivo.nome, dado);
        }
    }
    const analistasOrdenados = [...analistasMap.entries()].sort((arquivo, base) => base[1].totalMs - arquivo[1].totalMs).slice(0, 5).map(([nome, diretorio]) => ({
        nome,
        totalMs: diretorio.totalMs,
        mediaMs: diretorio.totalMs / diretorio.execucoes,
        execucoes: diretorio.execucoes,
        ocorrencias: diretorio.ocorrencias
    }));
    return {
        totalExecucoes: total,
        mediaAnaliseMs: somaAnalise / total,
        mediaParsingMs: somaParsing / total,
        topAnalistas: analistasOrdenados
    };
}
export function comandoMetricas() {
    return new Command('metricas').description(messages.CliComandoMetricasMensagens.descricao).option('-j, --json', 'Saída em JSON bruto (historico e agregados)').option('-l, --limite <n>', 'Quantidade de registros mais recentes (default 10)', valor => Number(valor), 10).option('-e, --export <arquivo>', 'Exporta histórico completo em JSON para arquivo').option('-a, --analistas', 'Exibe tabela agregada por analista (top 5)').action(async (opts) => {
        try {
            const caminho = config.ANALISE_METRICAS_HISTORICO_PATH;
            const historico = await lerEstado(caminho).catch(() => []);
            const lista = Array.isArray(historico) ? historico : [];
            const ultimos = opts.limite ? lista.slice(-opts.limite) : lista;
            const agg = agregados(lista) || undefined;
            if (opts.export) {
                const destino = path.isAbsolute(opts.export) ? opts.export : path.join(process.cwd(), opts.export);
                await salvarEstado(destino, {
                    exportadoEm: new Date().toISOString(),
                    total: lista.length,
                    historico: lista
                });
                log.sucesso(messages.CliComandoMetricasMensagens.historicoExportado(destino));
                return;
            }
            if (opts.json) {
                console.log(JSON.stringify({
                    total: lista.length,
                    limite: opts.limite,
                    historico: ultimos,
                    agregados: agg
                }, null, 2));
                return;
            }
            logMetricas.execucoesRegistradas(lista.length);
            if (!lista.length) {
                logMetricas.nenhumHistorico();
                return;
            }
            for (const hash of ultimos) {
                const timestampISO = new Date(hash.timestamp).toISOString();
                log.info(messages.CliComandoMetricasMensagens.linhaExecucao(timestampISO, hash.totalArquivos ?? 0, formatarDuracao(hash.tempoAnaliseMs ?? 0), formatarDuracao(hash.tempoParsingMs ?? 0), hash.cacheAstHits ?? 0, hash.cacheAstMiss ?? 0));
            }
            if (opts.analistas && agg) {
                log.info(messages.CliComandoMetricasMensagens.linhaEmBranco);
                log.info(messages.CliComandoMetricasMensagens.tituloTopAnalistas(messages.ICONES_DIAGNOSTICO.info));
                for (const arquivo of agg.topAnalistas) {
                    log.info(messages.CliComandoMetricasMensagens.linhaTopAnalista(arquivo.nome, formatMs(arquivo.totalMs), formatMs(arquivo.mediaMs), arquivo.execucoes, arquivo.ocorrencias));
                }
            }
            if (agg) {
                log.info(messages.CliComandoMetricasMensagens.medias(formatMs(agg.mediaAnaliseMs), formatMs(agg.mediaParsingMs)));
            }
        }
        catch (err) {
            log.erro(`Falha ao processar métricas: ${err instanceof Error ? err.message : String(err)}`);
            sair(ExitCode.Failure);
        }
    });
}
//# sourceMappingURL=command-metrics.js.map