import { messages } from '../../../core/messages/index.js';
import { otimizarSvgLikeSvgo, shouldSugerirOtimizacaoSvg } from '../../../shared/formatters/index.js';
import { criarAnalista, criarOcorrencia } from '../../../types/index.js';
const disableEnv = process.env.TUTANUS_DISABLE_PLUGIN_SVG === '1';
function findLine(src, index = 0) {
    const safeIndex = Math.max(0, index);
    let line = 1;
    for (let indice = 0; indice < safeIndex && indice < src.length; indice++) {
        if (src.charCodeAt(indice) === 10)
            line++;
    }
    return line;
}
function findFirstMatchLine(src, re, fallbackLine = 1) {
    const idx = src.search(re);
    if (idx < 0)
        return fallbackLine;
    return findLine(src, idx);
}
function msg(message, relPath, nivel = messages.SeverityNiveis.warning, line = 1) {
    return criarOcorrencia({
        relPath,
        mensagem: message,
        linha: line,
        nivel,
        origem: messages.AnalystOrigens.svg,
        tipo: messages.AnalystTipos.svg
    });
}
export const analistaSvg = criarAnalista({
    nome: 'analista-svg',
    categoria: 'assets',
    descricao: 'Heurísticas para SVG + sugestão de otimização (modo Tutanus).',
    global: false,
    test: (relPath) => /\.svg$/i.test(relPath),
    aplicar: async (src, relPath) => {
        if (disableEnv)
            return null;
        const ocorrencias = [];
        if (!/<svg\b/i.test(src)) {
            ocorrencias.push(msg(messages.SvgMensagens.naoPareceSvg, relPath, messages.SeverityNiveis.warning, 1));
            return ocorrencias;
        }
        const idxSvg = src.search(/<svg\b/i);
        const linhaSvg = idxSvg >= 0 ? findLine(src, idxSvg) : 1;
        const opt = otimizarSvgLikeSvgo({
            svg: src
        });
        for (const dimensaoLargura of opt.warnings) {
            if (dimensaoLargura === 'script-inline') {
                const line = findFirstMatchLine(src, /<script\b/i, linhaSvg);
                ocorrencias.push(msg(messages.SvgMensagens.scriptInline, relPath, messages.SeverityNiveis.error, line));
            }
            else if (dimensaoLargura === 'evento-inline') {
                const line = findFirstMatchLine(src, /\son\w+\s*=\s*['"]/i, linhaSvg);
                ocorrencias.push(msg(messages.SvgMensagens.eventoInline, relPath, messages.SeverityNiveis.warning, line));
            }
            else if (dimensaoLargura === 'javascript-url') {
                const line = findFirstMatchLine(src, /javascript:\s*/i, linhaSvg);
                ocorrencias.push(msg(messages.SvgMensagens.javascriptUrl, relPath, messages.SeverityNiveis.error, line));
            }
        }
        if (!/\bviewBox\s*=\s*['"][^'"]+['"]/i.test(src)) {
            ocorrencias.push(msg(messages.SvgMensagens.semViewBox, relPath, messages.SeverityNiveis.info, linhaSvg));
        }
        if (opt.changed && opt.originalBytes > opt.optimizedBytes && shouldSugerirOtimizacaoSvg(opt.originalBytes, opt.optimizedBytes)) {
            ocorrencias.push(msg(messages.SvgMensagens.podeOtimizar(opt.originalBytes, opt.optimizedBytes, opt.mudancas), relPath, messages.SeverityNiveis.info, linhaSvg));
        }
        return ocorrencias.length ? ocorrencias : null;
    }
});
//# sourceMappingURL=analyst-svg.js.map