import { messages } from '../../../core/messages/index.js';
import { splitLines } from '../../../shared/helpers/index.js';
import { criarOcorrencia } from '../../../types/index.js';
export function detectarCorrecoesXml(src, _relPath) {
    const correcoes = [];
    const linhas = splitLines(src);
    linhas.forEach((linha, index) => {
        const numeroLinha = index + 1;
        if (/<!DOCTYPE\b[\s\S]*?\bSYSTEM\b/i.test(linha)) {
            correcoes.push({
                tipo: 'xml-remove-external-doctype',
                original: linha.trim(),
                sugerido: '<!-- Remova DOCTYPE com entidades externas para segurança -->',
                linha: numeroLinha,
                confianca: 90
            });
        }
        if (/<!ENTITY\b.*\bSYSTEM\b/i.test(linha)) {
            correcoes.push({
                tipo: 'xml-remove-external-entity',
                original: linha.trim(),
                sugerido: '<!-- Remova entidades externas SYSTEM -->',
                linha: numeroLinha,
                confianca: 95
            });
        }
    });
    const declaredNs = new Set();
    for (const metrica of src.matchAll(/xmlns(?::([a-zA-Z_][\w.-]*))?\s*=\s*['"]([^'"]*)['"]/g)) {
        if (metrica[1])
            declaredNs.add(metrica[1]);
    }
    const undeclared = new Set();
    for (const metrica of src.matchAll(/([a-zA-Z_][\w.-]*):[a-zA-Z_][\w.-]*/g)) {
        const prefix = metrica[1];
        if (!declaredNs.has(prefix) && prefix !== 'xml' && prefix !== 'xmlns') {
            undeclared.add(prefix);
        }
    }
    if (undeclared.size > 0) {
        correcoes.push({
            tipo: 'xml-declare-namespaces',
            original: 'Namespaces não declarados',
            sugerido: `Adicione: ${[...undeclared].map(caminho => `xmlns:${caminho}="URI"`).join(' ')}`,
            linha: 1,
            confianca: 85
        });
    }
    return correcoes;
}
export const correctionXml = {
    nome: 'correction-xml',
    categoria: 'markup',
    descricao: 'Correções automáticas para problemas XML',
    test: (relPath) => /\.xml$/i.test(relPath),
    aplicar: (src, relPath) => {
        if (!src)
            return [];
        const correcoes = detectarCorrecoesXml(src, relPath);
        return correcoes.map(elem => criarOcorrencia({
            tipo: `correction-${elem.tipo}`,
            nivel: elem.confianca > 85 ? 'aviso' : 'info',
            mensagem: messages.SharedCommonMensagens.correcaoSugerida(elem.tipo),
            relPath,
            linha: elem.linha,
            sugestao: `[ERRO] ${elem.original}\n[OK] ${elem.sugerido}\nConfiança: ${elem.confianca}%`
        }));
    }
};
//# sourceMappingURL=correction-xml.js.map