import { findQuickFixes } from '../../core/config/auto/index.js';
import { extrairSupressoes, isRegraSuprimida } from '../../shared/helpers/index.js';
import { criarOcorrencia } from '../../types/index.js';
import { analisarTexto, calcularLinha } from './scoring-shared.js';
function mapearCategoriaNivel(category) {
    switch (category) {
        case 'security':
            return 'erro';
        case 'performance':
            return 'aviso';
        case 'style':
        case 'documentation':
            return 'info';
        default:
            return 'info';
    }
}
export const analistaQuickFixes = {
    nome: 'quick-fixes',
    categoria: 'melhorias',
    descricao: 'Detecta problemas comuns e oferece correções automáticas',
    test: (relPath) => {
        return /\.(js|jsx|ts|tsx|mjs|cjs|svg)$/.test(relPath);
    },
    aplicar: (src, relPath, _ast) => {
        if (!src)
            return [];
        const ocorrencias = [];
        const quickFixes = findQuickFixes(src, undefined, undefined, relPath);
        const problemaTipos = ['unhandled-async', 'console-log', 'memory-leak', 'dangerous-html', 'eval-usage', 'complex-regex'];
        for (const problemTipo of problemaTipos) {
            const specificFixes = findQuickFixes(src, problemTipo, undefined, relPath);
            quickFixes.push(...specificFixes);
        }
        const uniqueFixes = quickFixes.filter((fix, index, arr) => arr.findIndex(arquivo => arquivo.id === fix.id) === index);
        for (const fixResultado of uniqueFixes) {
            for (const match of fixResultado.matches) {
                const linha = calcularLinha(src, match.index, match);
                const previewCorrecao = fixResultado.fix(match, src);
                const originalLine = src.split('\n')[linha - 1] || '';
                const fixedLine = previewCorrecao.split('\n')[linha - 1] || '';
                const sugestao = [fixResultado.description, '', `[CHAVE-INGLESA] Correção sugerida:`, `[ERRO] Antes: ${originalLine.trim()}`, `[OK] Depois: ${fixedLine.trim()}`, '', `Confiança: ${fixResultado.confidence}%`, `Categoria: ${fixResultado.category}`, `ID do Fix: ${fixResultado.id}`].join('\n');
                const nivel = mapearCategoriaNivel(fixResultado.category);
                const ocorrencia = criarOcorrencia({
                    tipo: 'auto-fix-disponivel',
                    nivel,
                    mensagem: `${fixResultado.title}`,
                    relPath,
                    linha
                });
                const ocorrenciaGenerica = ocorrencia;
                ocorrenciaGenerica.sugestao = sugestao;
                ocorrenciaGenerica.quickFixId = fixResultado.id;
                ocorrenciaGenerica.confidence = fixResultado.confidence;
                ocorrenciaGenerica.category = fixResultado.category;
                ocorrenciaGenerica.matchIndex = match.index;
                ocorrenciaGenerica.matchLength = match[0].length;
                ocorrencias.push(ocorrencia);
            }
        }
        return ocorrencias;
    }
};
export const analistaPontuacao = {
    nome: 'pontuacao-fix',
    categoria: 'formatacao',
    descricao: 'Detecta problemas de pontuação, caracteres estranhos e formatação de texto',
    test: (relPath) => {
        return /\.(md|txt|mdx)$/.test(relPath);
    },
    aplicar: (src, relPath) => {
        if (!src)
            return [];
        const supressoes = extrairSupressoes(src);
        const problemas = analisarTexto(src);
        const ocorrencias = [];
        for (const problema of problemas) {
            const linha = calcularLinha(src, problema.posicao);
            if (isRegraSuprimida(problema.tipo, linha, supressoes))
                continue;
            const linhas = src.split('\n');
            const contexto = linhas[linha - 1] || '';
            const ocorrencia = criarOcorrencia({
                tipo: problema.tipo,
                nivel: (problema.confianca ?? 0) > 80 ? 'aviso' : 'info',
                mensagem: problema.descricao,
                relPath,
                linha
            });
            const ocorrenciaExtendida = ocorrencia;
            ocorrenciaExtendida.sugestao = problema.sugestao;
            ocorrenciaExtendida.confianca = problema.confianca;
            ocorrenciaExtendida.contexto = contexto;
            ocorrencias.push(ocorrencia);
        }
        return ocorrencias;
    }
};
export const analistas = [analistaQuickFixes, analistaPontuacao];
//# sourceMappingURL=analyst-scoring.js.map