import { estatisticasUsoGlobal } from '../analysts/js-ts/analysts/index.js';
import { chalk, config } from '../core/config/index.js';
import { getMessages } from '../core/messages/index.js';
const { log, logRelatorio, RelatorioMensagens, RelatorioZeladorSaudeMensagens } = getMessages();
export function exibirRelatorioZeladorSaude(ocorrencias) {
    const constsMap = estatisticasUsoGlobal.consts;
    const requiresMap = estatisticasUsoGlobal.requires;
    const constExcessivas = Object.entries(constsMap || {}).filter(([, node]) => node > 3);
    const requireRepetidos = Object.entries(requiresMap || {}).filter(([, node]) => node > 3);
    log.info(`\n${RelatorioMensagens.saude.titulo}:\n`);
    if (!process.env.VITEST) {
        imprimirCabecalhoMoldura();
    }
    if (ocorrencias.length > 0) {
        const logAviso = log.aviso;
        if (typeof logAviso === 'function')
            logAviso('[AVISO] Funções longas encontradas:');
        else
            logRelatorio.funcoesLongas();
        const { porArquivo, totalOcorrencias, arquivosAfetados, maiorPorArquivo } = agregarOcorrenciasPorArquivo(ocorrencias);
        const mostrarTabela = config.RELATORIO_SAUDE_TABELA_ENABLED && !config.VERBOSE;
        const temImprimirBloco = typeof log.imprimirBloco === 'function';
        if (mostrarTabela && temImprimirBloco) {
            exibirTabelaComMoldura(totalOcorrencias, arquivosAfetados, maiorPorArquivo);
        }
        else if (mostrarTabela) {
            exibirTabelaSimples(totalOcorrencias, arquivosAfetados, maiorPorArquivo);
        }
        else {
            exibirModoVerboso(porArquivo);
        }
    }
    else {
        log.sucesso(RelatorioMensagens.saude.secoes.funcoesLongas.vazio);
    }
    if (constExcessivas.length > 0) {
        log.info(RelatorioMensagens.saude.secoes.constantesDuplicadas.titulo);
        for (const [nome, qtd] of constExcessivas) {
            log.info(RelatorioZeladorSaudeMensagens.itemLista.replace('{nome}', nome).replace('{qtd}', String(qtd)));
        }
        log.info('');
    }
    if (requireRepetidos.length > 0) {
        log.info(RelatorioMensagens.saude.secoes.modulosRequire.titulo);
        for (const [nome, qtd] of requireRepetidos) {
            log.info(RelatorioZeladorSaudeMensagens.itemLista.replace('{nome}', nome).replace('{qtd}', String(qtd)));
        }
        log.info('');
    }
    log.sucesso(RelatorioMensagens.saude.secoes.fim.titulo);
    if (!process.env.VITEST) {
        imprimirRodapeMoldura();
    }
}
function imprimirCabecalhoMoldura() {
    const tituloCab = RelatorioMensagens.saude.titulo.replace('[SOAP] ', '');
    const linhasCab = [];
    const logBloco = log;
    const larguraCab = logBloco.calcularLargura ? logBloco.calcularLargura(tituloCab, linhasCab, config.COMPACT_MODE ? 84 : 96) : undefined;
    logBloco.imprimirBloco(tituloCab, linhasCab, chalk.cyan.bold, typeof larguraCab === 'number' ? larguraCab : config.COMPACT_MODE ? 84 : 96);
}
function agregarOcorrenciasPorArquivo(ocorrencias) {
    const porArquivo = new Map();
    for (const ocorrencia of ocorrencias) {
        const key = ocorrencia.relPath || ocorrencia.arquivo || '[desconhecido]';
        porArquivo.set(key, (porArquivo.get(key) || 0) + 1);
    }
    const totalOcorrencias = ocorrencias.length;
    const arquivosAfetados = porArquivo.size;
    const maiorPorArquivo = Math.max(...Array.from(porArquivo.values()));
    return { porArquivo, totalOcorrencias, arquivosAfetados, maiorPorArquivo };
}
function exibirTabelaComMoldura(totalOcorrencias, arquivosAfetados, maiorPorArquivo) {
    const logBloco = log;
    const header1 = RelatorioZeladorSaudeMensagens.headerArquivos;
    const header2 = RelatorioZeladorSaudeMensagens.headerQuantidade;
    const linhas = [];
    const col1Width = Math.max(header1.length, RelatorioZeladorSaudeMensagens.comFuncaoLonga.length, RelatorioZeladorSaudeMensagens.funcoesLongasTotal.length, RelatorioZeladorSaudeMensagens.maiorPorArquivo.length);
    const col2Width = Math.max(header2.length, String(totalOcorrencias).length, String(arquivosAfetados).length, String(maiorPorArquivo).length);
    const pinta = (node) => chalk.yellow(String(node).padStart(col2Width));
    linhas.push(`${header1.padEnd(col1Width)}  ${header2.padStart(col2Width)}`, `${'-'.repeat(col1Width)}  ${'-'.repeat(col2Width)}`, `${RelatorioZeladorSaudeMensagens.comFuncaoLonga.padEnd(col1Width)}  ${pinta(arquivosAfetados)}`, `${RelatorioZeladorSaudeMensagens.funcoesLongasTotal.padEnd(col1Width)}  ${pinta(totalOcorrencias)}`, `${RelatorioZeladorSaudeMensagens.maiorPorArquivo.padEnd(col1Width)}  ${pinta(maiorPorArquivo)}`, ''.padEnd(col1Width + col2Width + 2, ' '), `${RelatorioZeladorSaudeMensagens.modoResumido.padStart(Math.floor(col1Width / 2) + 4).padEnd(col1Width + col2Width + 2)}`);
    logBloco.imprimirBloco(RelatorioZeladorSaudeMensagens.funcoesLongasLabel, linhas, chalk.cyan.bold, logBloco.calcularLargura ? logBloco.calcularLargura(RelatorioZeladorSaudeMensagens.funcoesLongasLabel, linhas, config.COMPACT_MODE ? 84 : 96) : 84);
    log.info(RelatorioMensagens.saude.instrucoes.diagnosticoDetalhado);
    log.info(RelatorioMensagens.saude.instrucoes.tabelasVerbosas);
    log.info('');
}
function exibirTabelaSimples(totalOcorrencias, arquivosAfetados, maiorPorArquivo) {
    const header1 = RelatorioZeladorSaudeMensagens.headerArquivos;
    const header2 = RelatorioZeladorSaudeMensagens.headerQuantidade;
    const col1Width = Math.max(header1.length, RelatorioZeladorSaudeMensagens.comFuncaoLonga.length, RelatorioZeladorSaudeMensagens.funcoesLongasTotal.length, RelatorioZeladorSaudeMensagens.maiorPorArquivo.length);
    const col2Width = Math.max(header2.length, String(totalOcorrencias).length, String(arquivosAfetados).length, String(maiorPorArquivo).length);
    log.info(`${header1.padEnd(col1Width)}  ${header2.padStart(col2Width)}`);
    log.info(`${'-'.repeat(col1Width)}  ${'-'.repeat(col2Width)}`);
    log.info(`${RelatorioZeladorSaudeMensagens.comFuncaoLonga.padEnd(col1Width)}  ${chalk.yellow(String(arquivosAfetados).padStart(col2Width))}`);
    log.info(`${RelatorioZeladorSaudeMensagens.funcoesLongasTotal.padEnd(col1Width)}  ${chalk.yellow(String(totalOcorrencias).padStart(col2Width))}`);
    log.info(`${RelatorioZeladorSaudeMensagens.maiorPorArquivo.padEnd(col1Width)}  ${chalk.yellow(String(maiorPorArquivo).padStart(col2Width))}`);
    log.info('');
    log.info(RelatorioMensagens.saude.instrucoes.diagnosticoDetalhado);
    log.info(RelatorioMensagens.saude.instrucoes.tabelasVerbosas);
    log.info('');
}
function exibirModoVerboso(porArquivo) {
    const logInfoRaw = (log.infoSemSanitizar || log.info).bind(log);
    const titulo = chalk.bold(RelatorioMensagens.saude.secoes.funcoesLongas.titulo);
    log.info(titulo);
    const colLeft = 50;
    const linhasDetalhe = [];
    const ordenar = Array.from(porArquivo.entries()).sort((a, b) => b[1] - a[1]);
    for (const [arquivo, qtd] of ordenar) {
        const left = arquivo.length > colLeft ? `...${arquivo.slice(-colLeft + 1)}` : arquivo;
        const numero = chalk.yellow(String(qtd).padStart(3));
        linhasDetalhe.push(`${left.padEnd(colLeft)}  ${numero}`);
    }
    for (const linha of linhasDetalhe)
        logInfoRaw(linha);
    log.info('');
}
function imprimirRodapeMoldura() {
    const logBloco = log;
    const tituloFim = RelatorioMensagens.saude.secoes.fim.titulo;
    const linhasFim = [RelatorioZeladorSaudeMensagens.mandouBem];
    const larguraFim = logBloco.calcularLargura ? logBloco.calcularLargura(tituloFim, linhasFim, config.COMPACT_MODE ? 84 : 96) : undefined;
    logBloco.imprimirBloco(tituloFim, linhasFim, chalk.green.bold, typeof larguraFim === 'number' ? larguraFim : config.COMPACT_MODE ? 84 : 96);
}
//# sourceMappingURL=report-caretaker-health.js.map