import path from 'node:path';
import { otimizarSvgLikeSvgo, shouldSugerirOtimizacaoSvg } from '../../../shared/formatters/index.js';
function formatBytes(bytes) {
    if (!Number.isFinite(bytes) || bytes < 0)
        return String(bytes);
    if (bytes < 1024)
        return `${bytes}B`;
    const kb = bytes / 1024;
    if (kb < 1024)
        return `${kb.toFixed(1)}KB`;
    const mb = kb / 1024;
    return `${mb.toFixed(1)}MB`;
}
export async function exportarRelatorioSvgOtimizacao(params) {
    const { entries, relatoriosDir, ts } = params;
    const candidatos = [];
    for (const erro of entries) {
        if (!erro || typeof erro.relPath !== 'string')
            continue;
        if (!/\.svg$/i.test(erro.relPath))
            continue;
        if (typeof erro.content !== 'string')
            continue;
        if (!/<svg\b/i.test(erro.content))
            continue;
        const opt = otimizarSvgLikeSvgo({
            svg: erro.content
        });
        const shouldSuggest = opt.changed && opt.originalBytes > opt.optimizedBytes && shouldSugerirOtimizacaoSvg(opt.originalBytes, opt.optimizedBytes);
        if (!shouldSuggest)
            continue;
        const savedBytes = opt.originalBytes - opt.optimizedBytes;
        candidatos.push({
            relPath: erro.relPath,
            dir: path.posix.dirname(erro.relPath),
            originalBytes: opt.originalBytes,
            optimizedBytes: opt.optimizedBytes,
            savedBytes,
            mudancas: opt.mudancas,
            temViewBox: /\bviewBox\s*=\s*['"][^'"]+['"]/i.test(erro.content)
        });
    }
    const totalEconomiaBytes = candidatos.reduce((acc, elem) => acc + elem.savedBytes, 0);
    const porDir = new Map();
    for (const elem of candidatos) {
        const key = elem.dir;
        const existing = porDir.get(key);
        if (!existing) {
            porDir.set(key, {
                count: 1,
                totalSaved: elem.savedBytes,
                exemplos: [elem]
            });
        }
        else {
            existing.count += 1;
            existing.totalSaved += elem.savedBytes;
            if (existing.exemplos.length < 10)
                existing.exemplos.push(elem);
        }
    }
    const outputCaminho = path.join(relatoriosDir, `tutanus-svg-otimizacao-${ts}.md`);
    let md = '';
    md += '# Relatório de Otimização de SVG\n\n';
    md += `Gerado em: ${new Date().toISOString()}\n\n`;
    md += `Arquivos candidatos: **${candidatos.length}**\n\n`;
    md += `Economia potencial total: **${formatBytes(totalEconomiaBytes)}**\n\n`;
    md += '## Por diretório\n\n';
    md += '| Diretório | Arquivos | Economia |\n';
    md += '|---|---:|---:|\n';
    const dirsOrdenados = Array.from(porDir.entries()).sort((arquivo, base) => base[1].totalSaved - arquivo[1].totalSaved);
    for (const [dir, info] of dirsOrdenados) {
        md += `| ${dir} | ${info.count} | ${formatBytes(info.totalSaved)} |\n`;
    }
    md += '\n## Exemplos (top 30 por economia)\n\n';
    const topArquivos = [...candidatos].sort((arquivo, base) => base.savedBytes - arquivo.savedBytes).slice(0, 30);
    for (const arquivo of topArquivos) {
        const mudancas = arquivo.mudancas.join(', ');
        md += `- ${arquivo.relPath} - ${formatBytes(arquivo.originalBytes)} → ${formatBytes(arquivo.optimizedBytes)} (−${formatBytes(arquivo.savedBytes)})`;
        md += ` - mudanças: ${mudancas}`;
        md += arquivo.temViewBox ? '' : ' - (sem viewBox)';
        md += '\n';
    }
    const { promises: fs } = await import('node:fs');
    await fs.mkdir(relatoriosDir, {
        recursive: true
    });
    await fs.writeFile(outputCaminho, md, 'utf-8');
    return {
        outputCaminho,
        totalArquivos: candidatos.length,
        totalEconomiaBytes
    };
}
//# sourceMappingURL=svg-optimization-exporter.js.map