import { splitLines } from '../../../shared/helpers/index.js';
import { criarOcorrencia } from '../../../types/index.js';
export const detectorTailwindBestPractices = {
    nome: 'detector-tailwind-best-practices',
    categoria: 'estilo',
    descricao: 'Detecta más práticas em Tailwind CSS',
    test: (relPath) => /\.(jsx|tsx|js|ts|html|astro)$/i.test(relPath),
    aplicar: (src, relPath) => {
        if (!src)
            return [];
        const ocorrencias = [];
        const linhas = splitLines(src);
        linhas.forEach((linha, index) => {
            const numeroLinha = index + 1;
            if (/\bclass(Name)?\s*=\s*["'][^"']*["']/.test(linha)) {
                const classMatch = linha.match(/\bclass(Name)?\s*=\s*["']([^"']*)["']/);
                if (classMatch) {
                    const classes = classMatch[2].split(/\s+/).filter(Boolean);
                    const seen = new Map();
                    classes.forEach(token => {
                        const base = token.split(':').pop() || token;
                        const propKey = getPropertyKey(base);
                        if (propKey) {
                            if (!seen.has(propKey))
                                seen.set(propKey, []);
                            const existing = seen.get(propKey);
                            if (existing)
                                existing.push(token);
                        }
                    });
                    for (const [key, tokens] of seen) {
                        if (tokens.length > 1) {
                            ocorrencias.push(criarOcorrencia({
                                tipo: 'tailwind-conflicting-classes',
                                nivel: 'aviso',
                                mensagem: `Classes conflitantes para ${key}: ${tokens.join(', ')}`,
                                relPath,
                                linha: numeroLinha,
                                sugestao: 'Remova classes conflitantes, mantenha apenas a desejada'
                            }));
                        }
                    }
                    const duplicates = classes.filter((elem, indice) => classes.indexOf(elem) !== indice);
                    if (duplicates.length > 0) {
                        ocorrencias.push(criarOcorrencia({
                            tipo: 'tailwind-repeated-classes',
                            nivel: 'info',
                            mensagem: `Classes repetidas: ${[...new Set(duplicates)].join(', ')}`,
                            relPath,
                            linha: numeroLinha,
                            sugestao: 'Remova classes duplicadas'
                        }));
                    }
                }
            }
            if (/class(Name)?=.*\[[^\]]+\]/.test(linha)) {
                const arbitraryMatch = linha.match(/\[([^\]]+)\]/g);
                if (arbitraryMatch) {
                    for (const val of arbitraryMatch) {
                        if (!/(var\(|rgb\(|hsl\(|calc\(|url\()/i.test(val)) {
                            ocorrencias.push(criarOcorrencia({
                                tipo: 'tailwind-arbitrary-value',
                                nivel: 'info',
                                mensagem: `Valor arbitrário detectado: ${val}`,
                                relPath,
                                linha: numeroLinha,
                                sugestao: 'Considere adicionar ao tailwind.config.js'
                            }));
                        }
                    }
                }
            }
            if (/class(Name)?=.*!['"\]]/.test(linha) || /class(Name)?=.*!\]/.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'tailwind-important',
                    nivel: 'info',
                    mensagem: '!important detectado em classe Tailwind',
                    relPath,
                    linha: numeroLinha,
                    sugestao: 'Evite !important - refatore a especificidade'
                }));
            }
        });
        return ocorrencias;
    }
};
function getPropertyKey(token) {
    if (/^(p|m)[trblxy]?(-|$|\[)/.test(token))
        return 'spacing';
    if (/^(bg-|text-|border-)/.test(token))
        return 'color';
    if (/^(w-|h-|min-|max-)/.test(token))
        return 'size';
    if (/^(flex|grid|block|inline)/.test(token))
        return 'display';
    if (/^rounded/.test(token))
        return 'rounded';
    if (/^shadow(?:-sm|-md|-lg|-xl|-2xl|-inner|-none)?$/.test(token))
        return 'shadow-size';
    if (/^shadow/.test(token))
        return 'shadow-color';
    if (/^opacity/.test(token))
        return 'opacity';
    return null;
}
//# sourceMappingURL=detector-tailwind-best-practices.js.map