import { splitLines } from '../../../shared/helpers/index.js';
import { criarOcorrencia } from '../../../types/index.js';
export const detectorHtmlAccessibility = {
    nome: 'detector-html-accessibility',
    categoria: 'markup',
    descricao: 'Detecta problemas de acessibilidade em HTML',
    test: (relPath) => /\.(html|htm)$/i.test(relPath),
    aplicar: (src, relPath) => {
        if (!src)
            return [];
        const ocorrencias = [];
        const linhas = splitLines(src);
        const srcCompleto = src;
        const isTemplate = /\.(template\.html|\.component\.html)$/i.test(relPath);
        if (!isTemplate) {
            if (!/<!DOCTYPE\s+html>/i.test(srcCompleto)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'html-missing-doctype',
                    nivel: 'aviso',
                    mensagem: 'DOCTYPE ausente',
                    relPath,
                    linha: 1,
                    sugestao: 'Adicione <!DOCTYPE html> no início do arquivo'
                }));
            }
            if (!/<html[^>]*\slang=['"][^'"]+['"]/i.test(srcCompleto)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'html-missing-lang',
                    nivel: 'aviso',
                    mensagem: 'Atributo lang ausente no <html>',
                    relPath,
                    linha: 1,
                    sugestao: 'Adicione lang="pt-BR" ou idioma adequado'
                }));
            }
            if (!/<title>[^<]+<\/title>/i.test(srcCompleto)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'html-missing-title',
                    nivel: 'erro',
                    mensagem: '<title> ausente ou vazio',
                    relPath,
                    linha: 1,
                    sugestao: 'Adicione um <title> descritivo'
                }));
            }
        }
        linhas.forEach((linha, index) => {
            const numeroLinha = index + 1;
            if (/<img(?![^>]*alt=)[^>]*>/i.test(linha) && !/aria-hidden=['"]true['"]/i.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'html-img-without-alt',
                    nivel: 'erro',
                    mensagem: 'Imagem sem atributo alt',
                    relPath,
                    linha: numeroLinha,
                    sugestao: 'Adicione alt descritivo ou aria-hidden="true"'
                }));
            }
            if (/<input(?![^>]*(aria-label|aria-labelledby|id=))/i.test(linha) && !/type=['"]?(hidden|button|submit|reset)['"]?/i.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'html-input-without-label',
                    nivel: 'aviso',
                    mensagem: 'Input sem label associada',
                    relPath,
                    linha: numeroLinha,
                    sugestao: 'Adicione <label for="id"> ou aria-label'
                }));
            }
            if (/\son(click|submit|change|mouseover|keydown)\s*=/i.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'html-inline-handler',
                    nivel: 'info',
                    mensagem: 'Event handler inline detectado',
                    relPath,
                    linha: numeroLinha,
                    sugestao: 'Use addEventListener ao invés de handlers inline'
                }));
            }
            if (/<a[^>]*href=['"]#?['"][^>]*>/i.test(linha) && !/onclick|role=['"]button['"]/i.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'html-empty-link',
                    nivel: 'aviso',
                    mensagem: 'Link com href vazio ou #',
                    relPath,
                    linha: numeroLinha,
                    sugestao: 'Use href válido ou button com role="button"'
                }));
            }
            if (/<form[^>]*>/i.test(linha)) {
                if (!/\smethod=/i.test(linha)) {
                    ocorrencias.push(criarOcorrencia({
                        tipo: 'html-form-without-method',
                        nivel: 'aviso',
                        mensagem: 'Form sem método definido',
                        relPath,
                        linha: numeroLinha,
                        sugestao: 'Adicione method="GET" ou method="POST"'
                    }));
                }
            }
        });
        return ocorrencias;
    }
};
//# sourceMappingURL=detector-html-accessibility.js.map