import fs from 'node:fs';
import path from 'node:path';
import { messages } from '../../../core/messages/index.js';
export function gerarRelatorioJson(dados) {
    return JSON.stringify({ $schema: 'tutanus://schemas/gitlab-ci-report/v1', geradoEm: new Date().toISOString(), versao: '0.7.0', ...dados }, null, 2);
}
export function gerarRelatorioMarkdown(dados, opcoes) {
    const linhas = [];
    const titulo = opcoes?.titulo || 'Relatório de Análise - GitLab CI';
    linhas.push(`# ${titulo}`, '', `**Repositório:** ${dados.nomeRepositorio}`, `**Data:** ${dados.dataAnalise}`, `**Tempo:** ${dados.tempoAnaliseMs}ms`, '');
    linhas.push('## Resumo', '', '| Métrica | Valor |', '|---|---|', `| Score Geral | ${dados.scoreGeral}/100 |`, `| Total de Pipelines | ${dados.totalPipelines} |`, `| Total de Ocorrências | ${dados.ocorrencias.length} |`, '');
    linhas.push('## Severidade', '', '| Severidade | Quantidade |', '|---|---|');
    for (const [sev, count] of Object.entries(dados.resumoPorSeveridade))
        linhas.push(`| ${sev} | ${count} |`);
    linhas.push('', '## Pipelines Analisados', '', '| Pipeline | Score | Ocorrências |', '|---|---|---|');
    for (const p of dados.pipelines)
        linhas.push(`| ${p.nome} | ${p.score}/100 | ${p.ocorrencias} |`);
    if (opcoes?.incluirDetalhes !== false && dados.ocorrencias.length > 0) {
        linhas.push('', '## Ocorrências Detalhadas', '', '| Arquivo | Linha | Severidade | Tipo | Mensagem |', '|---|---|---|---|---|');
        for (const o of dados.ocorrencias.slice(0, 200))
            linhas.push(`| \`${o.relPath}\` | ${o.linha || '-'} | ${o.nivel || 'info'} | ${o.tipo || ''} | ${(o.mensagem || '').replace(/\|/g, '\\|').replace(/\n/g, ' ')} |`);
    }
    linhas.push('', '*Gerado por Tutanus v0.7.0*');
    return linhas.join('\n');
}
export function gerarRelatorioHtml(dados, opcoes) {
    const titulo = opcoes?.titulo || 'Relatório de Análise - GitLab CI';
    const sc = dados.scoreGeral >= 80 ? '#10b981' : dados.scoreGeral >= 50 ? '#f59e0b' : '#ef4444';
    return `<!DOCTYPE html><html lang="pt-BR"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>${titulo}</title><style>*{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;background:#0d1117;color:#c9d1d9;padding:2rem}.container{max-width:1200px;margin:0 auto}h1{color:#e24329;margin-bottom:.5rem}h2{color:#e24329;margin:2rem 0 1rem;border-bottom:1px solid #21262d;padding-bottom:.5rem}.meta{color:#8b949e;margin-bottom:2rem}.score-card{background:#161b22;border:1px solid #30363d;border-radius:12px;padding:2rem;text-align:center;margin-bottom:2rem}.score-value{font-size:4rem;font-weight:bold;color:${sc}}.score-label{color:#8b949e;font-size:1.2rem}table{width:100%;border-collapse:collapse;margin:1rem 0}th{background:#161b22;color:#e24329;padding:.75rem 1rem;text-align:left;border-bottom:2px solid #30363d}td{padding:.75rem 1rem;border-bottom:1px solid #21262d}tr:hover{background:#161b22}.badge{padding:.25rem .5rem;border-radius:12px;font-size:.85rem;font-weight:600}.badge-erro{background:rgba(239,68,68,.2);color:#ef4444}.badge-aviso{background:rgba(245,158,11,.2);color:#f59e0b}.badge-info{background:rgba(56,139,253,.2);color:#388bfd}.summary-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:1rem;margin:1rem 0}.summary-item{background:#161b22;border:1px solid #30363d;border-radius:8px;padding:1rem}.summary-item .label{color:#8b949e;font-size:.85rem}.summary-item .value{font-size:1.5rem;font-weight:bold;color:#e24329}.footer{margin-top:3rem;padding-top:1rem;border-top:1px solid #21262d;color:#8b949e;font-size:.85rem;text-align:center}code{background:#161b22;padding:.2rem .4rem;border-radius:4px;font-family:'JetBrains Mono',monospace;font-size:.9em}</style></head><body><div class="container"><h1>${titulo}</h1><div class="meta"><p><strong>Repositório:</strong> ${dados.nomeRepositorio} | <strong>Data:</strong> ${dados.dataAnalise} | <strong>Tempo:</strong> ${dados.tempoAnaliseMs}ms</p></div><div class="score-card"><div class="score-value">${dados.scoreGeral}</div><div class="score-label">Score (0-100)</div></div><h2>Resumo</h2><div class="summary-grid"><div class="summary-item"><div class="label">Pipelines</div><div class="value">${dados.totalPipelines}</div></div><div class="summary-item"><div class="label">Ocorrências</div><div class="value">${dados.ocorrencias.length}</div></div>${Object.entries(dados.resumoPorSeveridade).map(([s, c]) => `<div class="summary-item"><div class="label">${s}</div><div class="value">${c}</div></div>`).join('')}</div><h2>Pipelines</h2><table><thead><tr><th>Pipeline</th><th>Score</th><th>Ocorrências</th></tr></thead><tbody>${dados.pipelines.map(p => `<tr><td>${p.nome}</td><td style="color:${p.score >= 80 ? '#10b981' : p.score >= 50 ? '#f59e0b' : '#ef4444'};font-weight:bold">${p.score}/100</td><td>${p.ocorrencias}</td></tr>`).join('')}</tbody></table><h2>Ocorrências</h2><table><thead><tr><th>Arquivo</th><th>Linha</th><th>Severidade</th><th>Tipo</th><th>Mensagem</th></tr></thead><tbody>${dados.ocorrencias.slice(0, 200).map(o => `<tr><td><code>${o.relPath}</code></td><td>${o.linha || '-'}</td><td><span class="badge badge-${o.nivel || 'info'}">${o.nivel || 'info'}</span></td><td>${o.tipo || ''}</td><td>${o.mensagem || ''}</td></tr>`).join('')}</tbody></table>${dados.ocorrencias.length > 200 ? `<p style="color:#8b949e;margin-top:1rem">Mostrando 200 de ${dados.ocorrencias.length}</p>` : ''}<div class="footer"><p>Gerado por Tutanus v0.7.0</p></div></div></body></html>`;
}
export function gerarRelatorioCsv(dados) {
    const linhas = ['Arquivo,Linha,Severidade,Tipo,Mensagem,Sugestao'];
    for (const o of dados.ocorrencias)
        linhas.push([o.relPath, String(o.linha || ''), o.nivel || 'info', o.tipo || '', `"${(o.mensagem || '').replace(/"/g, '""')}"`, `"${(o.sugestao || '').replace(/"/g, '""')}"`].join(','));
    return linhas.join('\n');
}
export async function gerarRelatorio(dados, opcoes) {
    const conteudo = (() => {
        switch (opcoes.formato) {
            case 'json': return gerarRelatorioJson(dados);
            case 'markdown': return gerarRelatorioMarkdown(dados, { titulo: opcoes.titulo, incluirDetalhes: opcoes.incluirDetalhes });
            case 'html': return gerarRelatorioHtml(dados, { titulo: opcoes.titulo });
            case 'csv': return gerarRelatorioCsv(dados);
            default: throw new Error(messages.ExcecoesMensagens.formatoNaoSuportado(opcoes.formato));
        }
    })();
    fs.mkdirSync(path.dirname(opcoes.output), { recursive: true });
    fs.writeFileSync(opcoes.output, conteudo, 'utf-8');
    return opcoes.output;
}
export function prepararDadosRelatorio(ocorrencias, nomeRepositorio, tempoAnaliseMs, pipelines) {
    const pList = pipelines || [];
    const resumo = {};
    const resumoTipo = {};
    for (const o of ocorrencias) {
        resumo[String(o.nivel || 'info')] = (resumo[String(o.nivel || 'info')] || 0) + 1;
        resumoTipo[o.tipo || 'desconhecido'] = (resumoTipo[o.tipo || 'desconhecido'] || 0) + 1;
    }
    const scoreGeral = pList.length > 0 ? Math.round(pList.reduce((s, p) => s + p.score, 0) / pList.length) : Math.max(0, 100 - ocorrencias.length * 5);
    return { nomeRepositorio, dataAnalise: new Date().toISOString(), totalPipelines: pList.length || 1, scoreGeral, ocorrencias, resumoPorSeveridade: resumo, resumoPorTipo: resumoTipo, pipelines: pList, tempoAnaliseMs };
}
//# sourceMappingURL=generator-report-gitlab-ci.js.map