import fs from 'node:fs';
import path from 'node:path';
import { messages } from '../../../core/messages/index.js';
export function gerarRelatorioJson(dados) {
    const relatorio = {
        $schema: 'tutanus://schemas/github-actions-report/v1',
        geradoEm: new Date().toISOString(),
        versao: '0.6.0',
        ...dados
    };
    return JSON.stringify(relatorio, null, 2);
}
export function gerarRelatorioMarkdown(dados, opcoes) {
    const linhas = [];
    const titulo = opcoes?.titulo || 'Relatório de Análise - GitHub Actions';
    linhas.push(`# ${titulo}`);
    linhas.push('');
    linhas.push(`**Repositório:** ${dados.nomeRepositorio}`);
    linhas.push(`**Data:** ${dados.dataAnalise}`);
    linhas.push(`**Tempo de Análise:** ${dados.tempoAnaliseMs}ms`);
    linhas.push('');
    linhas.push('## [GRAFICO] Resumo Geral');
    linhas.push('');
    linhas.push(`| Métrica | Valor |`);
    linhas.push(`|---|---|`);
    linhas.push(`| Score Geral | ${dados.scoreGeral}/100 |`);
    linhas.push(`| Total de Workflows | ${dados.totalWorkflows} |`);
    linhas.push(`| Total de Ocorrências | ${dados.ocorrencias.length} |`);
    linhas.push('');
    linhas.push('## [RED] Severidade');
    linhas.push('');
    linhas.push(`| Severidade | Quantidade |`);
    linhas.push(`|---|---|`);
    for (const [sev, count] of Object.entries(dados.resumoPorSeveridade)) {
        const icon = sev === 'erro' ? '[RED]' : sev === 'aviso' ? '[YELLOW]' : '[BLUE]';
        linhas.push(`| ${icon} ${sev} | ${count} |`);
    }
    linhas.push('');
    linhas.push('## [LIST] Workflows Analisados');
    linhas.push('');
    linhas.push(`| Workflow | Score | Ocorrências |`);
    linhas.push(`|---|---|---|`);
    for (const wf of dados.workflows) {
        const scoreIcon = wf.score >= 80 ? '[OK]' : wf.score >= 50 ? '[AVISO]' : '[ERRO]';
        linhas.push(`| ${scoreIcon} ${wf.nome} | ${wf.score}/100 | ${wf.ocorrencias} |`);
    }
    linhas.push('');
    if (opcoes?.incluirDetalhes !== false && dados.ocorrencias.length > 0) {
        linhas.push('## [BUSCA] Ocorrências Detalhadas');
        linhas.push('');
        linhas.push(`| Arquivo | Linha | Severidade | Tipo | Mensagem |`);
        linhas.push(`|---|---|---|---|---|`);
        for (const ocorrencia of dados.ocorrencias.slice(0, 200)) {
            const nivel = ocorrencia.nivel || 'info';
            const tipo = ocorrencia.tipo || 'desconhecido';
            const msg = (ocorrencia.mensagem || '').replace(/\\/g, '\\\\').replace(/\|/g, '\\|').replace(/\n/g, ' ').replace(/\r/g, ' ').replace(/\*/g, '\\*').replace(/_/g, '\\_').replace(/\[/g, '\\[').replace(/\]/g, '\\]').replace(/</g, '\\<').replace(/>/g, '\\>');
            const linha = ocorrencia.linha || '-';
            linhas.push(`| \`${ocorrencia.relPath}\` | ${linha} | ${nivel} | ${tipo} | ${msg} |`);
        }
        if (dados.ocorrencias.length > 200) {
            linhas.push('');
            linhas.push(`> Mostrando 200 de ${dados.ocorrencias.length} ocorrências.`);
        }
        linhas.push('');
    }
    linhas.push('---');
    linhas.push('');
    linhas.push(`*Gerado por Tutanus v0.6.0 em ${new Date().toISOString()}*`);
    return linhas.join('\n');
}
export function gerarRelatorioHtml(dados, opcoes) {
    const titulo = opcoes?.titulo || 'Relatório de Análise - GitHub Actions';
    const scoreColor = 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>${escapeHtml(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: #58a6ff; margin-bottom: 0.5rem; }
    h2 { color: #58a6ff; margin: 2rem 0 1rem; border-bottom: 1px solid #21262d; padding-bottom: 0.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: ${scoreColor}; }
    .score-label { color: #8b949e; font-size: 1.2rem; }
    table { width: 100%; border-collapse: collapse; margin: 1rem 0; }
    th { background: #161b22; color: #58a6ff; padding: 0.75rem 1rem; text-align: left; border-bottom: 2px solid #30363d; }
    td { padding: 0.75rem 1rem; border-bottom: 1px solid #21262d; }
    tr:hover { background: #161b22; }
    .badge { padding: 0.25rem 0.5rem; border-radius: 12px; font-size: 0.85rem; font-weight: 600; }
    .badge-erro { background: rgba(239,68,68,0.2); color: #ef4444; }
    .badge-aviso { background: rgba(245,158,11,0.2); color: #f59e0b; }
    .badge-info { background: rgba(56,139,253,0.2); color: #388bfd; }
    .badge-sucesso { background: rgba(16,185,129,0.2); color: #10b981; }
    .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: 0.85rem; }
    .summary-item .value { font-size: 1.5rem; font-weight: bold; color: #58a6ff; }
    .footer { margin-top: 3rem; padding-top: 1rem; border-top: 1px solid #21262d; color: #8b949e; font-size: 0.85rem; text-align: center; }
    code { background: #161b22; padding: 0.2rem 0.4rem; border-radius: 4px; font-family: 'JetBrains Mono', monospace; font-size: 0.9em; }
  </style>
</head>
<body>
  <div class="container">
    <h1>[FOGO] ${escapeHtml(titulo)}</h1>
    <div class="meta">
      <p><strong>Repositório:</strong> ${escapeHtml(dados.nomeRepositorio)} | <strong>Data:</strong> ${escapeHtml(dados.dataAnalise)} | <strong>Tempo:</strong> ${escapeHtml(String(dados.tempoAnaliseMs))}ms</p>
    </div>

    <div class="score-card">
      <div class="score-value">${dados.scoreGeral}</div>
      <div class="score-label">Score Geral (0-100)</div>
    </div>

    <h2>[GRAFICO] Resumo</h2>
    <div class="summary-grid">
      <div class="summary-item">
        <div class="label">Workflows</div>
        <div class="value">${dados.totalWorkflows}</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(([sev, count]) => `
      <div class="summary-item">
        <div class="label">${escapeHtml(sev)}</div>
        <div class="value">${count}</div>
      </div>`).join('')}
    </div>

    <h2>[LIST] Workflows</h2>
    <table>
      <thead><tr><th>Workflow</th><th>Score</th><th>Ocorrências</th></tr></thead>
      <tbody>
        ${dados.workflows.map(wf => {
        const scoreColor2 = wf.score >= 80 ? '#10b981' : wf.score >= 50 ? '#f59e0b' : '#ef4444';
        return `<tr><td>${escapeHtml(wf.nome)}</td><td style="color:${scoreColor2};font-weight:bold">${wf.score}/100</td><td>${wf.ocorrencias}</td></tr>`;
    }).join('')}
      </tbody>
    </table>

    <h2>[BUSCA] 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(ocorrencia => `
        <tr>
          <td><code>${escapeHtml(ocorrencia.relPath)}</code></td>
          <td>${ocorrencia.linha || '-'}</td>
          <td><span class="badge badge-${ocorrencia.nivel || 'info'}">${escapeHtml(String(ocorrencia.nivel || 'info'))}</span></td>
          <td>${escapeHtml(ocorrencia.tipo || '')}</td>
          <td>${escapeHtml(ocorrencia.mensagem || '')}</td>
        </tr>`).join('')}
      </tbody>
    </table>
    ${dados.ocorrencias.length > 200 ? `<p style="color:#8b949e;margin-top:1rem">Mostrando 200 de ${dados.ocorrencias.length} ocorrências.</p>` : ''}

    <div class="footer">
      <p>Gerado por Tutanus v0.6.0 em ${new Date().toISOString()}</p>
    </div>
  </div>
</body>
</html>`;
}
export function gerarRelatorioCsv(dados) {
    const linhas = [];
    linhas.push('Arquivo,Linha,Severidade,Tipo,Mensagem,Sugestao');
    for (const ocorrencia of dados.ocorrencias) {
        const campos = [csvEscape(ocorrencia.relPath), csvEscape(String(ocorrencia.linha || '')), csvEscape(String(ocorrencia.nivel || 'info')), csvEscape(ocorrencia.tipo || ''), csvEscape(ocorrencia.mensagem || ''), csvEscape(ocorrencia.sugestao || '')];
        linhas.push(campos.join(','));
    }
    return linhas.join('\n');
}
function escapeHtml(str) {
    return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#039;');
}
function csvEscape(str) {
    if (str.includes(',') || str.includes('"') || str.includes('\n')) {
        return `"${str.replace(/"/g, '""')}"`;
    }
    return str;
}
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));
        }
    })();
    const dir = path.dirname(opcoes.output);
    fs.mkdirSync(dir, {
        recursive: true
    });
    fs.writeFileSync(opcoes.output, conteudo, 'utf-8');
    return opcoes.output;
}
export function calcularResumoPorSeveridade(ocorrencias) {
    const resumo = {};
    for (const ocorrencia of ocorrencias) {
        const nivel = String(ocorrencia.nivel || 'info');
        resumo[nivel] = (resumo[nivel] || 0) + 1;
    }
    return resumo;
}
export function calcularResumoPorTipo(ocorrencias) {
    const resumo = {};
    for (const ocorrencia of ocorrencias) {
        const tipo = ocorrencia.tipo || 'desconhecido';
        resumo[tipo] = (resumo[tipo] || 0) + 1;
    }
    return resumo;
}
export function prepararDadosRelatorio(ocorrencias, nomeRepositorio, tempoAnaliseMs, workflows) {
    const wfList = workflows || [];
    const totalWorkflows = wfList.length || 1;
    const scoreGeral = wfList.length > 0 ? Math.round(wfList.reduce((sum, dimensaoLargura) => sum + dimensaoLargura.score, 0) / wfList.length) : Math.max(0, 100 - ocorrencias.length * 5);
    return {
        nomeRepositorio,
        dataAnalise: new Date().toISOString(),
        totalWorkflows,
        scoreGeral,
        ocorrencias,
        resumoPorSeveridade: calcularResumoPorSeveridade(ocorrencias),
        resumoPorTipo: calcularResumoPorTipo(ocorrencias),
        workflows: wfList,
        tempoAnaliseMs
    };
}
//# sourceMappingURL=generator-report-github-actions.js.map