import path from 'node:path';
import { executarInquisicao, scanRepository } from '../core/execution/index.js';
import { decifrarSintaxe } from '../core/parsing/index.js';
import { asTecnicas } from '../types/index.js';
const EXTENSOES_COM_AST = new Set([
    '.js', '.jsx', '.ts', '.tsx', '.mjs', '.cjs',
    '.css', '.scss', '.html', '.xml', '.svg',
    '.py', '.go', '.rs', '.php', '.sh',
    '.yaml', '.yml', '.json',
]);
function extensaoRelevante(relPath) {
    const ext = path.extname(relPath).toLowerCase();
    return EXTENSOES_COM_AST.has(ext);
}
async function carregarTecnicas() {
    const { registroAnalistas } = await import('../analysts/registry/index.js');
    return asTecnicas(registroAnalistas);
}
function tecnicasParaArquivo(tecnicas, relPath) {
    return tecnicas.filter(t => {
        if (t.global)
            return false;
        if (!t.test)
            return extensaoRelevante(relPath);
        return t.test(relPath);
    });
}
const AST_SENTINEL = {};
export async function analyzeFile(filePath, content, baseDir) {
    const inicio = performance.now();
    const relPath = baseDir ? path.relative(baseDir, filePath) : path.basename(filePath);
    if (!extensaoRelevante(relPath)) {
        return { ocorrencias: [], arquivo: relPath, tempoMs: 0 };
    }
    const ext = path.extname(filePath).toLowerCase();
    const parsed = await decifrarSintaxe(content, ext, { relPath });
    const ast = parsed ? AST_SENTINEL : null;
    const tecnicas = await carregarTecnicas();
    const tecnicasFile = tecnicasParaArquivo(tecnicas, relPath);
    if (tecnicasFile.length === 0) {
        return { ocorrencias: [], arquivo: relPath, tempoMs: performance.now() - inicio };
    }
    const ocorrencias = [];
    for (const tecnica of tecnicasFile) {
        try {
            const resultado = await tecnica.aplicar(content, relPath, ast, filePath);
            if (Array.isArray(resultado)) {
                ocorrencias.push(...resultado);
            }
            else if (resultado) {
                ocorrencias.push(resultado);
            }
        }
        catch {
        }
    }
    return {
        ocorrencias,
        arquivo: relPath,
        tempoMs: performance.now() - inicio,
    };
}
export async function analyzeProject(projectDir, opts) {
    const inicio = performance.now();
    const fileEntries = await scanRepository(projectDir, {
        includeContent: true,
    });
    const entries = Object.values(fileEntries);
    const fileEntriesComAst = entries.map(f => ({ ...f, ast: undefined }));
    let filteredEntries = fileEntriesComAst;
    if (opts?.fast) {
        filteredEntries = fileEntriesComAst.filter(fe => {
            const rel = fe.relPath || '';
            return !rel.includes('node_modules') && !rel.includes('.test.') && !rel.includes('.spec.');
        });
    }
    const tecnicas = await carregarTecnicas();
    const resultadoExecucao = await executarInquisicao(filteredEntries, tecnicas, projectDir, null, { verbose: false, compact: true, fast: opts?.fast });
    return {
        ocorrencias: resultadoExecucao.ocorrencias || [],
        totalArquivos: entries.length,
        tempoMs: performance.now() - inicio,
    };
}
//# sourceMappingURL=analyzer.js.map