import { getMessages } from '../../../core/messages/index.js';
import { agruparOcorrenciasPorArquivo, agruparSugestoesPorTipo, calcularMetricas, extrairSugestoes, gerarSecaoAcoesRecomendadas, gerarSecaoArquivosTop, gerarSecaoExemplos, gerarSecaoQualidade, gerarSecaoSugestoes, gerarSecaoTiposFrequentes, rotuloScore, rotuloSeveridade } from './report-helpers.js';
const MAX_LISTADAS = 200;
const MAX_DETALHE_COMENTARIO = 12000;
export function gerarTituloPrRelatorio(branch, score, baseRef) {
    const estado = rotuloScore(score);
    const sufixo = baseRef ? `${branch} → ${baseRef}` : branch;
    return `${getMessages().GithubPushReportMensagens.rotuloScoreNome} (${estado}) — ${sufixo}`;
}
function metadadosRelatorioMarkdown(resultado, ctx) {
    const shaCurto = ctx.headSha.slice(0, 7);
    const sev = resultado.resumoPorSeveridade;
    const origemLabel = ctx.origem === 'pull_request' || ctx.baseRef
        ? `PR → \`${ctx.baseRef}\` … \`${ctx.branch}\``
        : `branch \`${ctx.branch}\``;
    let md = `# Diagnóstico Tutanus

**Repositório:** \`${ctx.owner}/${ctx.repo}\`  
**Escopo:** ${origemLabel}  
**Score geral:** ${resultado.scoreGeral}/100 (${rotuloScore(resultado.scoreGeral)})  
**Commit:** \`${shaCurto}\`  
**Mensagem:** ${ctx.commitMessage.replace(/\n/g, ' ')}  
**Arquivos no projeto:** ${resultado.totalArquivos}  
**Ocorrências:** ${resultado.totalOcorrencias}  
**Duração:** ${(resultado.duracaoMs / 1000).toFixed(1)} s
`;
    if (ctx.escopoIncremental && ctx.arquivosAlterados && ctx.arquivosAlterados.length > 0) {
        md += `\n## Arquivos no escopo (${ctx.arquivosAlterados.length})\n\n`;
        md += ctx.arquivosAlterados.slice(0, 40).map(f => `- \`${f}\``).join('\n');
        if (ctx.arquivosAlterados.length > 40) {
            md += getMessages().GithubPushReportMensagens.maisArquivos(ctx.arquivosAlterados.length - 40);
        }
        md += '\n';
    }
    md += `\n## Resumo por severidade\n\n| Nível | Quantidade |\n|-------|------------|\n`;
    for (const [nivel, qtd] of Object.entries(sev).sort()) {
        md += `| ${nivel} | ${qtd} |\n`;
    }
    if (Object.keys(resultado.resumoPorTipo).length > 0) {
        md += `\n## Resumo por tipo\n\n| Tipo | Quantidade |\n|------|------------|\n`;
        for (const [tipo, qtd] of Object.entries(resultado.resumoPorTipo).sort((a, b) => b[1] - a[1]).slice(0, 15)) {
            md += `| ${tipo} | ${qtd} |\n`;
        }
    }
    md += `\n## Ocorrências\n\n`;
    if (resultado.ocorrencias.length === 0) {
        md += getMessages().GithubPushReportMensagens.nenhumaOcorrencia;
    }
    else {
        for (const o of resultado.ocorrencias.slice(0, MAX_LISTADAS)) {
            const linha = o.linha ? `:${o.linha}` : '';
            const sug = o.sugestao ? ` — _${o.sugestao}_` : '';
            md += `- **${rotuloSeveridade(o.nivel)}** \`${o.relPath}${linha}\` — ${o.mensagem}${sug}\n`;
        }
        if (resultado.ocorrencias.length > MAX_LISTADAS) {
            md += getMessages().GithubPushReportMensagens.maisOcorrencias(resultado.ocorrencias.length - MAX_LISTADAS);
        }
    }
    md += `\n---\n\n_Relatório gerado pelo [Tutanus](https://github.com/anomalyco/tutanus) via GitHub App._\n`;
    return md;
}
export function gerarRelatorioMarkdown(resultado, ctx) {
    return metadadosRelatorioMarkdown(resultado, ctx);
}
export const gerarRelatorioPushMarkdown = gerarRelatorioMarkdown;
function truncarRelatorio(detalhe) {
    if (detalhe.length > 60000) {
        return `${detalhe.slice(0, 60000)}\n\n_… relatório truncado devido ao tamanho._`;
    }
    return detalhe;
}
export function gerarCorpoPrRelatorio(resultado, ctx) {
    const { erros, avisos, infos } = calcularMetricas(resultado);
    const shaCurto = ctx.headSha.slice(0, 7);
    const estado = rotuloScore(resultado.scoreGeral);
    const escopo = ctx.escopoIncremental && ctx.arquivosAlterados?.length
        ? `${ctx.arquivosAlterados.length} arquivo(s) alterado(s)`
        : 'repositório completo';
    const rotulo = ctx.baseRef ? `\`${ctx.branch}\` → \`${ctx.baseRef}\`` : `\`${ctx.branch}\``;
    let body = `## Diagnóstico Tutanus — ${rotulo}

**Score: ${resultado.scoreGeral}/100 (${estado})** · Commit \`${shaCurto}\` · Escopo: ${escopo}

`;
    body += gerarSecaoQualidade(resultado.scoreGeral);
    body += `### Resumo da análise

| 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** |

`;
    if (resultado.totalOcorrencias > 0) {
        body += `### Principais problemas encontrados\n\n`;
        body += gerarSecaoExemplos(resultado.ocorrencias, erros, avisos, infos);
        const arquivosAgrupados = agruparOcorrenciasPorArquivo(resultado.ocorrencias);
        if (arquivosAgrupados.length > 0) {
            body += gerarSecaoArquivosTop(arquivosAgrupados);
        }
        body += gerarSecaoTiposFrequentes(resultado.resumoPorTipo);
        const sugestoesAgrupadas = agruparSugestoesPorTipo(resultado.ocorrencias);
        if (sugestoesAgrupadas.length > 0) {
            body += gerarSecaoSugestoes(sugestoesAgrupadas);
        }
    }
    else {
        body += `### Nenhum problema encontrado\n\nO código analisado não apresentou ocorrências.\n\n`;
    }
    body += gerarSecaoAcoesRecomendadas();
    const alvo = ctx.baseRef ? `\`${ctx.baseRef}\`` : 'produção';
    body += `### Sobre esta análise\n\n`;
    body += `Esta análise foi executada automaticamente pelo **GitHub App Tutanus** no servidor do app. `;
    body += `Não depende de workflows ou configurações no seu repositório. `;
    body += `Cada novo push em \`${ctx.branch}\` atualiza este diagnóstico. O PR propõe a fusão em ${alvo}.\n\n`;
    const relatorioCompleto = gerarRelatorioMarkdown(resultado, ctx);
    body += `<details>\n<summary><strong>Relatório detalhado (completo)</strong></summary>\n\n${truncarRelatorio(relatorioCompleto)}\n\n</details>\n\n`;
    body += `---\n\n<sub>PR automático · [Tutanus](https://github.com/anomalyco/tutanus) — análise em ${(resultado.duracaoMs / 1000).toFixed(1)}s</sub>`;
    return body;
}
export function gerarCorpoPrAnalise(resultado, ctx) {
    const { erros, avisos, infos } = calcularMetricas(resultado);
    const shaCurto = ctx.headSha.slice(0, 7);
    const estado = rotuloScore(resultado.scoreGeral);
    const escopo = ctx.escopoIncremental && ctx.arquivosAlterados?.length
        ? `${ctx.arquivosAlterados.length} arquivo(s) alterado(s)`
        : 'repositório completo';
    let body = `## Análise do PR — \`${ctx.branch}\` → \`${ctx.baseRef}\`

**Score: ${resultado.scoreGeral}/100 (${estado})** · Commit \`${shaCurto}\` · Escopo: ${escopo}

`;
    if (resultado.scoreGeral >= 80) {
        body += getMessages().GithubPushReportMensagens.prQualityOtimo;
    }
    else if (resultado.scoreGeral >= 60) {
        body += getMessages().GithubPushReportMensagens.prQualityAtencao;
    }
    else {
        body += getMessages().GithubPushReportMensagens.prQualityCritico;
    }
    body += `### Resumo

| Indicador | Valor |
|-----------|-------|
| Ocorrências totais | **${resultado.totalOcorrencias}** |
| Erros | **${erros}** |
| Avisos | **${avisos}** |
| Informações / Sugestões | **${infos}** |
| Duração | **${(resultado.duracaoMs / 1000).toFixed(1)} s** |

`;
    if (resultado.totalOcorrencias > 0) {
        body += gerarSecaoExemplos(resultado.ocorrencias, erros, avisos, infos, 5);
    }
    else {
        body += `### Nenhum problema encontrado\n\nEste PR não apresentou ocorrências.\n\n`;
    }
    body += `---\n\n`;
    body += `<sub>Análise via [Tutanus](https://github.com/anomalyco/tutanus) — ${(resultado.duracaoMs / 1000).toFixed(1)}s</sub>`;
    return body;
}
export const gerarCorpoPrPush = gerarCorpoPrRelatorio;
export function gerarComentarioAtualizacaoRelatorio(resultado, ctx) {
    const shaCurto = ctx.headSha.slice(0, 7);
    const { erros, avisos, infos } = calcularMetricas(resultado);
    const estado = rotuloScore(resultado.scoreGeral);
    const sugestoesLista = extrairSugestoes(resultado.ocorrencias || []);
    const rotulo = ctx.baseRef ? `\`${ctx.branch}\` → \`${ctx.baseRef}\`` : `\`${ctx.branch}\``;
    let body = `## Diagnóstico atualizado — \`${shaCurto}\`

Novo commit recebido em ${rotulo} (\`${shaCurto}\`). O relatório foi atualizado com os dados mais recentes.

| Métrica | Valor |
|---------|-------|
| Score | **${resultado.scoreGeral}/100** (${estado}) |
| Ocorrências | **${resultado.totalOcorrencias}** |
| Erros | **${erros}** |
| Avisos | **${avisos}** |
| Informações / Sugestões | **${infos}** |

`;
    if (sugestoesLista.length > 0) {
        body += `### Sugestões disponíveis (${sugestoesLista.length})\n\n`;
        for (const s of sugestoesLista.slice(0, 10)) {
            const linha = s.linha ? `:${s.linha}` : '';
            body += `- **\`${s.relPath}${linha}\`** — ${s.mensagem}\n`;
            body += `  > [IDEA] ${s.sugestao}\n\n`;
        }
        if (sugestoesLista.length > 10) {
            body += `*… e mais ${sugestoesLista.length - 10} sugestão(ões).*\n\n`;
        }
    }
    body += `> A descrição deste PR contém o diagnóstico completo atualizado. Revise as sugestões acima.`;
    return body;
}
export const gerarComentarioAtualizacaoPush = gerarComentarioAtualizacaoRelatorio;
export function gerarComentarioPrAnalise(resultado, ctx, relatorioCompleto) {
    const { erros, avisos } = calcularMetricas(resultado);
    const shaCurto = ctx.headSha.slice(0, 7);
    const estado = rotuloScore(resultado.scoreGeral);
    const escopo = ctx.escopoIncremental && ctx.arquivosAlterados?.length
        ? `${ctx.arquivosAlterados.length} arquivo(s) alterado(s) neste PR`
        : 'repositório completo';
    let detalhe = relatorioCompleto;
    if (detalhe.length > MAX_DETALHE_COMENTARIO) {
        detalhe = `${detalhe.slice(0, MAX_DETALHE_COMENTARIO)}\n\n_… relatório truncado. Consulte os comentários inline._`;
    }
    return `## Diagnóstico Tutanus

Análise do PR${ctx.prNumber ? ` #${ctx.prNumber}` : ''} (\`${ctx.baseRef}\` ← \`${ctx.branch}\`, \`${shaCurto}\`).

**Estado:** ${estado} · **Score:** ${resultado.scoreGeral}/100 · **Escopo:** ${escopo}

| Indicador | Valor |
|-----------|-------|
| Ocorrências | ${resultado.totalOcorrencias} |
| Erros | ${erros} |
| Avisos | ${avisos} |
| Arquivos no projeto | ${resultado.totalArquivos} |
| Duração | ${(resultado.duracaoMs / 1000).toFixed(1)} s |

Comentários inline foram adicionados nos principais achados.

<details>
<summary><strong>Relatório completo (markdown)</strong></summary>

${detalhe}

</details>

---

<sub>Análise via GitHub App · [Tutanus](https://github.com/anomalyco/tutanus)</sub>`;
}
export function gerarResumoReviewPr(totalOcorrencias, comentariosInline) {
    return `## Revisão Tutanus

Foram publicados **${comentariosInline}** comentário(s) inline (${totalOcorrencias} ocorrência(s) no escopo).

Revise as sugestões nos arquivos alterados.`;
}
//# sourceMappingURL=push-report.js.map