import { getMessages } from '../../../core/messages/index.js';
const MAX_EXEMPLOS = 10;
const MAX_SUGESTOES_LISTA = 10;
export function rotuloScore(score) {
    return getMessages().GithubPushReportMensagens.scoreLabel(score);
}
export function rotuloSeveridade(nivel) {
    const map = {
        erro: 'ERRO',
        aviso: 'AVISO',
        info: 'INFO',
        sugestao: 'SUGESTAO'
    };
    return map[nivel?.toLowerCase() ?? 'info'] ?? 'INFO';
}
export function rotuloSeveridadePt(nivel) {
    const map = {
        erro: 'Erro',
        aviso: 'Aviso',
        info: 'Info'
    };
    return map[nivel?.toLowerCase() ?? 'info'] ?? 'Info';
}
export function explicarSeveridade(nivel) {
    return getMessages().GithubPushReportMensagens.explicarSeveridade(nivel);
}
export function agruparOcorrenciasPorArquivo(ocorrencias) {
    const map = new Map();
    for (const o of ocorrencias) {
        const entry = map.get(o.relPath) ?? { count: 0, erros: 0, avisos: 0 };
        entry.count++;
        if (o.nivel === 'erro')
            entry.erros++;
        if (o.nivel === 'aviso')
            entry.avisos++;
        map.set(o.relPath, entry);
    }
    return Array.from(map.entries())
        .map(([relPath, data]) => ({ relPath, ...data }))
        .sort((a, b) => b.count - a.count);
}
export function extrairSugestoes(ocorrencias) {
    return ocorrencias
        .filter((o) => !!o.sugestao)
        .slice(0, 20)
        .map(o => ({
        mensagem: o.mensagem,
        relPath: o.relPath,
        linha: o.linha,
        sugestao: o.sugestao,
        nivel: o.nivel
    }));
}
export function agruparSugestoesPorTipo(ocorrencias) {
    const sugestoes = extrairSugestoes(ocorrencias);
    const map = new Map();
    for (const s of sugestoes) {
        const tipo = s.nivel || 'info';
        const arr = map.get(tipo) ?? [];
        arr.push(s);
        map.set(tipo, arr);
    }
    return Array.from(map.entries())
        .map(([tipo, sugestoes]) => ({ tipo, count: sugestoes.length, sugestoes }))
        .sort((a, b) => b.count - a.count);
}
export function gerarSecaoResumo(resultado, ctx, extra) {
    const erros = resultado.resumoPorSeveridade.erro ?? 0;
    const avisos = resultado.resumoPorSeveridade.aviso ?? 0;
    const infos = (resultado.resumoPorSeveridade.info ?? 0) + (resultado.resumoPorSeveridade.sugestao ?? 0);
    const shaCurto = ctx.headSha.slice(0, 7);
    const escopo = ctx.escopoIncremental && ctx.arquivosAlterados?.length
        ? `${ctx.arquivosAlterados.length} arquivo(s) alterado(s)`
        : 'repositório completo';
    const body = `${extra}
**Score:** · Commit \`${shaCurto}\` · Escopo: ${escopo}

### Resumo

| Indicador | Valor |
|-----------|-------|
| Ocorrências totais | **${resultado.totalOcorrencias}** |
| Erros | **${erros}** |
| Avisos | **${avisos}** |
| Informações / Sugestões | **${infos}** |
| Arquivos no projeto | **${resultado.totalArquivos}** |
| Tempo de análise | **${(resultado.duracaoMs / 1000).toFixed(1)} s** |

`;
    return body;
}
export function gerarSecaoQualidade(score) {
    const msgs = getMessages().GithubPushReportMensagens;
    if (score >= 80)
        return msgs.qualidadeOtimo;
    if (score >= 60)
        return msgs.qualidadeAtencao;
    return msgs.qualidadeCritico;
}
export function gerarSecaoExemplos(ocorrencias, erros, avisos, infos, limite) {
    const max = limite ?? MAX_EXEMPLOS;
    let body = '';
    if (erros > 0)
        body += `#### Erros (${erros})\n\n${explicarSeveridade('erro')}\n\n`;
    if (avisos > 0)
        body += `#### Avisos (${avisos})\n\n${explicarSeveridade('aviso')}\n\n`;
    if (infos > 0)
        body += `#### Informações / Sugestões (${infos})\n\n${explicarSeveridade('info')}\n\n`;
    if (ocorrencias.length > 0) {
        body += `#### Exemplos\n\n`;
        for (const o of ocorrencias.slice(0, max)) {
            const linha = o.linha ? `:${o.linha}` : '';
            const sug = o.sugestao ? `\n  > *${o.sugestao}*` : '';
            body += `- **${rotuloSeveridade(o.nivel)}** \`${o.relPath}${linha}\` — ${o.mensagem}${sug}\n`;
        }
        if (ocorrencias.length > max) {
            body += `\n  *… e mais ${ocorrencias.length - max} ocorrência(s).*\n`;
        }
        body += `\n`;
    }
    return body;
}
export function gerarSecaoArquivosTop(arquivosAgrupados, limite) {
    const top = arquivosAgrupados.slice(0, limite ?? 5);
    if (top.length === 0)
        return '';
    let body = `#### Arquivos com mais ocorrências\n\n| Arquivo | Total | Erros | Avisos |\n|---------|-------|-------|--------|\n`;
    for (const f of top) {
        body += `| \`${f.relPath}\` | ${f.count} | ${f.erros} | ${f.avisos} |\n`;
    }
    return `${body}\n`;
}
export function gerarSecaoTiposFrequentes(resumoPorTipo, limite) {
    const top = Object.entries(resumoPorTipo)
        .sort((a, b) => b[1] - a[1])
        .slice(0, limite ?? 8);
    if (top.length === 0)
        return '';
    let body = `#### Tipos de ocorrência mais frequentes\n\n`;
    for (const [tipo, qtd] of top) {
        body += `- **${tipo}**: ${qtd} ocorrência(s)\n`;
    }
    return `${body}\n`;
}
export function gerarSecaoSugestoes(sugestoesAgrupadas) {
    if (sugestoesAgrupadas.length === 0)
        return '';
    const total = sugestoesAgrupadas.reduce((s, g) => s + g.count, 0);
    let body = `#### Sugestões (${total})\n\nO Tutanus identificou as seguintes sugestões de melhoria:\n\n`;
    for (const grupo of sugestoesAgrupadas) {
        body += `<details>\n<summary><strong>${rotuloSeveridade(grupo.tipo)}</strong> — ${grupo.count} sugestão(ões)</summary>\n\n`;
        for (const s of grupo.sugestoes.slice(0, MAX_SUGESTOES_LISTA)) {
            const linha = s.linha ? `:${s.linha}` : '';
            body += `- **\`${s.relPath}${linha}\`** — ${s.mensagem}\n`;
            body += `  > [IDEA] ${s.sugestao}\n\n`;
        }
        body += `</details>\n\n`;
    }
    return body;
}
export function gerarSecaoAcoesRecomendadas() {
    return `### Ações recomendadas

1. Revise os erros — são os que têm maior impacto na qualidade e segurança
2. Analise os avisos — podem indicar bugs latentes ou dívida técnica
3. Considere as sugestões — melhoram manutenibilidade e performance
4. Consulte os comentários inline — cada ocorrência tem uma sugestão prática

`;
}
export function calcularMetricas(resultado) {
    return {
        erros: resultado.resumoPorSeveridade.erro ?? 0,
        avisos: resultado.resumoPorSeveridade.aviso ?? 0,
        infos: (resultado.resumoPorSeveridade.info ?? 0) + (resultado.resumoPorSeveridade.sugestao ?? 0)
    };
}
//# sourceMappingURL=report-helpers.js.map