import { getMessages } from '../core/messages/index.js';
const INFRA_PREFIXES = ['src/analistas/', 'src/core/messages/', 'src/bin/', 'src/cli/', 'src/shared/', 'extensions/', 'vitest.config.ts', 'THIRD-PARTY'];
const { AGRUPAMENTOS_MENSAGEM, PRIORIDADES, RelatorioMensagens } = getMessages();
export function processarRelatorioResumo(ocorrencias, limitePrioridade = 30) {
    const ocorrenciasFiltradas = [];
    const contagemInfra = new Map();
    for (const ocorrencia of ocorrencias) {
        const relPath = ocorrencia.relPath || '';
        const isInfraPath = INFRA_PREFIXES.some(prefix => relPath.startsWith(prefix));
        if (isInfraPath) {
            const chave = `${ocorrencia.tipo}::infra`;
            contagemInfra.set(chave, (contagemInfra.get(chave) || 0) + 1);
            if (contagemInfra.get(chave) === 1) {
                ocorrenciasFiltradas.push(ocorrencia);
            }
            continue;
        }
        ocorrenciasFiltradas.push(ocorrencia);
    }
    for (const [chave, total] of contagemInfra) {
        const tipo = chave.split('::')[0];
        if (total > 1) {
            ocorrenciasFiltradas.push({
                tipo,
                nivel: 'info',
                relPath: '(infraestrutura interna)',
                linha: 0,
                mensagem: RelatorioMensagens.resumo.filtroInteligente.colapsoInfra(total, tipo),
                origem: 'filtro-inteligente',
            });
        }
        else if (total === 1) {
        }
    }
    const effectiveOcorrencias = ocorrenciasFiltradas.length > 0 ? ocorrenciasFiltradas : ocorrencias;
    const { gruposPorTipo, gruposPorMensagem } = agruparOcorrencias(effectiveOcorrencias);
    const problemasAgrupados = converterGruposEmProblemas(gruposPorTipo, gruposPorMensagem);
    problemasAgrupados.sort((arquivo, base) => {
        const prioridadeOrdem = {
            critica: 0,
            alta: 1,
            media: 2,
            baixa: 3
        };
        const prioA = prioridadeOrdem[arquivo.prioridade];
        const prioB = prioridadeOrdem[base.prioridade];
        if (prioA !== prioB)
            return prioA - prioB;
        return base.quantidade - arquivo.quantidade;
    });
    const problemasCriticos = problemasAgrupados.filter(caminho => caminho.prioridade === 'critica');
    const problemasAltos = problemasAgrupados.filter(caminho => caminho.prioridade === 'alta');
    const problemasOutros = problemasAgrupados.filter(caminho => ['media', 'baixa'].includes(caminho.prioridade));
    const arquivosAfetados = new Set(effectiveOcorrencias.map(ocorrencia => ocorrencia.relPath).filter(path => path && path !== 'undefined')).size;
    const problemasPrioritarios = problemasCriticos.length + problemasAltos.length;
    return {
        problemasCriticos: problemasCriticos.slice(0, limitePrioridade / 3),
        problemasAltos: problemasAltos.slice(0, limitePrioridade / 3),
        problemasOutros: problemasOutros.slice(0, limitePrioridade / 3),
        estatisticas: {
            totalOcorrencias: effectiveOcorrencias.length,
            arquivosAfetados,
            problemasPrioritarios,
            problemasAgrupados: problemasAgrupados.length
        }
    };
}
function agruparOcorrencias(ocorrencias) {
    const gruposPorTipo = new Map();
    const gruposPorMensagem = new Map();
    for (const ocorrencia of ocorrencias) {
        const tipo = String(ocorrencia.tipo || 'OUTROS');
        if (!gruposPorTipo.has(tipo)) {
            gruposPorTipo.set(tipo, []);
        }
        const grupo = gruposPorTipo.get(tipo);
        if (grupo) {
            grupo.push(ocorrencia);
        }
    }
    for (const ocorrencia of ocorrencias) {
        const mensagem = String(ocorrencia.mensagem || '');
        let agrupado = false;
        for (const grupo of AGRUPAMENTOS_MENSAGEM) {
            if (grupo.padrao.test(mensagem)) {
                if (!gruposPorMensagem.has(grupo.categoria)) {
                    gruposPorMensagem.set(grupo.categoria, []);
                }
                const categoriaGrupo = gruposPorMensagem.get(grupo.categoria);
                if (categoriaGrupo) {
                    categoriaGrupo.push(ocorrencia);
                }
                agrupado = true;
                break;
            }
        }
        if (!agrupado) {
            const tipo = String(ocorrencia.tipo || 'OUTROS');
            if (!gruposPorMensagem.has(tipo)) {
                gruposPorMensagem.set(tipo, []);
            }
            const tipoGrupo = gruposPorMensagem.get(tipo);
            if (tipoGrupo) {
                tipoGrupo.push(ocorrencia);
            }
        }
    }
    return { gruposPorTipo, gruposPorMensagem };
}
function converterGruposEmProblemas(gruposPorTipo, gruposPorMensagem) {
    const problemasAgrupados = [];
    for (const [tipo, ocorrenciasTipo] of gruposPorTipo) {
        const config = PRIORIDADES[tipo] || {
            prioridade: 'baixa',
            icone: '??'
        };
        const jaAgrupado = Array.from(gruposPorMensagem.keys()).some(categoria => {
            const ocorrenciasGrupo = gruposPorMensagem.get(categoria) || [];
            return ocorrenciasGrupo.some(ocorrencia => ocorrencia.tipo === tipo);
        });
        if (!jaAgrupado && ocorrenciasTipo.length > 0) {
            problemasAgrupados.push({
                categoria: tipo,
                prioridade: config.prioridade,
                icone: config.icone,
                titulo: formatarTituloTipo(tipo),
                quantidade: ocorrenciasTipo.length,
                ocorrencias: ocorrenciasTipo,
                resumo: gerarResumoOcorrencias(ocorrenciasTipo)
            });
        }
    }
    for (const agrupamento of AGRUPAMENTOS_MENSAGEM) {
        const ocorrenciasGrupo = gruposPorMensagem.get(agrupamento.categoria) || [];
        if (ocorrenciasGrupo.length > 0) {
            problemasAgrupados.push({
                categoria: agrupamento.categoria,
                prioridade: 'critica',
                icone: '??',
                titulo: agrupamento.titulo,
                quantidade: ocorrenciasGrupo.length,
                ocorrencias: ocorrenciasGrupo,
                resumo: `${ocorrenciasGrupo.length} ocorrências detectadas`,
                acaoSugerida: agrupamento.acaoSugerida
            });
        }
    }
    return problemasAgrupados;
}
function formatarTituloTipo(tipo) {
    const titulos = {
        PROBLEMA_SEGURANCA: 'Problemas de Segurança',
        VULNERABILIDADE_SEGURANCA: 'Vulnerabilidades de Segurança',
        CODIGO_FRAGIL: 'Código Frágil',
        PROBLEMA_TESTE: 'Problemas de Teste',
        PROBLEMA_DOCUMENTACAO: 'Problemas de Documentação',
        CONSTRUCOES_SINTATICAS: 'Construções Sintáticas',
        ANALISE_ARQUITETURA: 'Análise de Arquitetura',
        CARACTERISTICAS_ARQUITETURA: 'Características de Arquitetura',
        METRICAS_ARQUITETURA: 'Métricas de Arquitetura',
        TODO_PENDENTE: 'TODOs Pendentes',
        'padrao-ausente': 'Padrões Ausentes',
        'estrutura-suspeita': 'Estrutura Suspeita',
        'estrutura-config': 'Configuração de Estrutura',
        'estrutura-entrypoints': 'Pontos de Entrada',
        IDENTIFICACAO_PROJETO: 'Identificação do Projeto',
        SUGESTAO_MELHORIA: 'Sugestões de Melhoria',
        EVIDENCIA_CONTEXTO: 'Evidências de Contexto',
        TECNOLOGIAS_ALTERNATIVAS: 'Tecnologias Alternativas'
    };
    return titulos[tipo] || tipo.replace(/_/g, ' ').replace(/\b\w/g, linha => linha.toUpperCase());
}
function gerarResumoOcorrencias(ocorrencias) {
    if (ocorrencias.length === 0)
        return 'Nenhuma ocorrência';
    const arquivos = new Set(ocorrencias.map(ocorrencia => ocorrencia.relPath).filter(Boolean));
    const niveisFrequentes = {};
    for (const nivel of ocorrencias.map(ocorrencia => ocorrencia.nivel).filter((nivel) => Boolean(nivel))) {
        niveisFrequentes[nivel] = (niveisFrequentes[nivel] || 0) + 1;
    }
    const nivelMaisFrequente = Object.entries(niveisFrequentes).sort(([, arquivo], [, base]) => (base ?? 0) - (arquivo ?? 0))[0]?.[0];
    let resumo = `${ocorrencias.length} ocorrências`;
    if (arquivos.size > 1) {
        resumo += ` em ${arquivos.size} arquivos`;
    }
    if (nivelMaisFrequente) {
        resumo += ` (maioria: ${nivelMaisFrequente})`;
    }
    return resumo;
}
export async function gerarRelatorioMarkdownResumo(relatorioResumo, outputCaminho) {
    const { problemasCriticos, problemasAltos, problemasOutros, estatisticas } = relatorioResumo;
    const linhas = [];
    linhas.push(`# ${RelatorioMensagens.resumo.titulo}`);
    linhas.push('');
    linhas.push(`> ${RelatorioMensagens.resumo.introducao}`);
    linhas.push('');
    linhas.push(`## ${RelatorioMensagens.resumo.secoes.estatisticas.titulo}`);
    linhas.push('');
    linhas.push(`- **${RelatorioMensagens.resumo.secoes.estatisticas.totalOcorrencias}**: ${estatisticas.totalOcorrencias.toLocaleString()}`);
    linhas.push(`- **${RelatorioMensagens.resumo.secoes.estatisticas.arquivosAfetados}**: ${estatisticas.arquivosAfetados.toLocaleString()}`);
    linhas.push(`- **${RelatorioMensagens.resumo.secoes.estatisticas.problemasPrioritarios}**: ${estatisticas.problemasPrioritarios}`);
    linhas.push(`- **${RelatorioMensagens.resumo.secoes.estatisticas.problemasAgrupados}**: ${estatisticas.problemasAgrupados}`);
    linhas.push('');
    escreverSecaoProblemasCriticos(linhas, problemasCriticos);
    escreverSecaoProblemasAltos(linhas, problemasAltos);
    escreverSecaoProblemasOutros(linhas, problemasOutros);
    linhas.push('---');
    linhas.push('');
    linhas.push(RelatorioMensagens.resumo.filtroInteligente.dica);
    linhas.push('');
    linhas.push(RelatorioMensagens.resumo.filtroInteligente.geradoEm(new Date().toLocaleString('pt-BR')));
    const { salvarEstado } = await import('../shared/persistence/index.js');
    try {
        await salvarEstado(outputCaminho, linhas.join('\n'));
    }
    catch (err) {
        const mensagem = err instanceof Error ? err.message : String(err);
        console.error(RelatorioMensagens.resumo.filtroInteligente.erroSalvar(mensagem));
    }
}
function escreverSecaoProblemasCriticos(linhas, problemasCriticos) {
    if (problemasCriticos.length === 0)
        return;
    linhas.push(`## ${RelatorioMensagens.resumo.secoes.criticos.titulo}`);
    linhas.push('');
    for (const problema of problemasCriticos) {
        linhas.push(`### ${problema.icone} ${problema.titulo}`);
        linhas.push('');
        linhas.push(`**${RelatorioMensagens.resumo.labels.quantidade}**: ${problema.quantidade} ocorrências`);
        linhas.push(`**Resumo**: ${problema.resumo}`);
        if (problema.acaoSugerida) {
            linhas.push(`**${RelatorioMensagens.resumo.labels.acaoSugerida}**: ${problema.acaoSugerida}`);
        }
        linhas.push('');
        const exemplos = problema.ocorrencias.slice(0, 3);
        if (exemplos.length > 0) {
            linhas.push(`**${RelatorioMensagens.resumo.labels.exemplos}:**`);
            for (const exemplo of exemplos) {
                const arquivo = exemplo.relPath || 'arquivo desconhecido';
                const linha = exemplo.linha ? `:${exemplo.linha}` : '';
                linhas.push(`- \`${arquivo}${linha}\`: ${exemplo.mensagem}`);
            }
            if (problema.quantidade > 3) {
                linhas.push(`- ... e mais ${problema.quantidade - 3} ocorrências`);
            }
            linhas.push('');
        }
    }
}
function escreverSecaoProblemasAltos(linhas, problemasAltos) {
    if (problemasAltos.length === 0)
        return;
    linhas.push(`## ${RelatorioMensagens.resumo.secoes.altos.titulo}`);
    linhas.push('');
    for (const problema of problemasAltos) {
        linhas.push(`### ${problema.icone} ${problema.titulo}`);
        linhas.push('');
        linhas.push(`**${RelatorioMensagens.resumo.labels.quantidade}**: ${problema.quantidade} | **Resumo**: ${problema.resumo}`);
        if (problema.acaoSugerida) {
            linhas.push(`**${RelatorioMensagens.resumo.labels.acaoSugerida}**: ${problema.acaoSugerida}`);
        }
        linhas.push('');
    }
}
function escreverSecaoProblemasOutros(linhas, problemasOutros) {
    if (problemasOutros.length === 0)
        return;
    linhas.push(`## ${RelatorioMensagens.resumo.secoes.outros.titulo}`);
    linhas.push('');
    linhas.push('| Categoria | Quantidade | Resumo |');
    linhas.push('|---|---|---|');
    for (const problema of problemasOutros) {
        linhas.push(`| ${problema.icone} ${problema.titulo} | ${problema.quantidade} | ${problema.resumo} |`);
    }
    linhas.push('');
}
export function gerarResumoExecutivo(ocorrencias) {
    const relatorio = processarRelatorioResumo(ocorrencias);
    const problemasCriticos = relatorio.problemasCriticos.reduce((sum, caminho) => sum + caminho.quantidade, 0);
    const problemasAltos = relatorio.problemasAltos.reduce((sum, caminho) => sum + caminho.quantidade, 0);
    const vulnerabilidades = ocorrencias.filter(ocorrencia => ocorrencia.tipo === 'VULNERABILIDADE_SEGURANCA' || ocorrencia.tipo === 'PROBLEMA_SEGURANCA').length;
    const quickFixes = ocorrencias.filter(ocorrencia => ocorrencia.tipo === 'QUICK_FIX_DISPONIVEL').length;
    let recomendacao;
    let mensagem;
    if (problemasCriticos > 10) {
        recomendacao = 'vermelho';
        mensagem = `?? CRÍTICO: ${problemasCriticos} problemas de segurança/estabilidade. Ação imediata necessária.`;
    }
    else if (problemasCriticos > 0 || problemasAltos > 50) {
        recomendacao = 'amarelo';
        mensagem = `?? ATENÇÃO: ${problemasCriticos} críticos, ${problemasAltos} altos. Planeje correções.`;
    }
    else {
        recomendacao = 'verde';
        mensagem = `? BOM: Apenas problemas menores. ${quickFixes} correções automáticas disponíveis.`;
    }
    return {
        problemasCriticos,
        problemasAltos,
        vulnerabilidades,
        quickFixes,
        recomendacao,
        mensagem,
        detalhes: [...relatorio.problemasCriticos, ...relatorio.problemasAltos]
    };
}
//# sourceMappingURL=filter-smart.js.map