import { registroAnalistas } from '../../../analysts/registry/index.js';
import { config } from '../../../core/config/index.js';
import { executarInquisicao, iniciarInquisicao } from '../../../core/execution/index.js';
import { aplicarSupressaoOcorrencias } from '../../../core/parsing/index.js';
import { dedupeOcorrencias } from '../../../shared/data-processing/index.js';
import { downloadRepo } from '../app/repo-downloader.js';
import { calcularScoreGeral, resumirPorSeveridade, resumirPorTipo, simplificarOcorrencias } from './full-analysis-utils.js';
import { atualizarJob, executarJob } from './job-manager.js';
export { calcularScoreGeral, resumirPorSeveridade, resumirPorTipo, simplificarOcorrencias };
export async function executarAnaliseInterna(repoDir, options) {
    const leituraInicial = await iniciarInquisicao(repoDir, {
        incluirMetadados: false,
        skipExec: true
    });
    const fileEntriesComAst = leituraInicial.fileEntries.map(entry => ({
        ...entry,
        ast: undefined
    }));
    let tecnicas = registroAnalistas;
    if (options.analistas && options.analistas.length > 0) {
        tecnicas = tecnicas.filter(a => {
            const nome = a.nome?.toLowerCase() || '';
            return (options.analistas ?? []).some((analista) => nome.includes(analista.toLowerCase()));
        });
    }
    if (options.fast) {
        tecnicas = tecnicas.filter(a => {
            const categoria = a.categoria?.toLowerCase() || '';
            return !categoria.includes('ci/cd') && !categoria.includes('workflow');
        });
        const filtered = fileEntriesComAst.filter((fe) => {
            const rel = fe.relPath || '';
            return rel.startsWith('src/') && !rel.includes('.test.') && !rel.includes('.spec.');
        });
        fileEntriesComAst.length = 0;
        fileEntriesComAst.push(...filtered);
    }
    const resultadoExecucao = await executarInquisicao(fileEntriesComAst, tecnicas, repoDir, undefined, { verbose: false, compact: true, fast: options.fast ?? false });
    let ocorrencias = dedupeOcorrencias(resultadoExecucao.ocorrencias || []);
    ocorrencias = aplicarSupressaoOcorrencias(ocorrencias, config);
    return {
        totalArquivos: resultadoExecucao.totalArquivos,
        arquivosAnalisados: resultadoExecucao.arquivosAnalisados || [],
        todasOcorrencias: ocorrencias,
        fileEntriesComAst
    };
}
export async function iniciarAnaliseCompleta(app, jobId, job) {
    await executarJob(jobId, async () => {
        atualizarJob(jobId, { status: 'baixando' });
        const { repoDir, cleanup } = await downloadRepo(app, job.installationId, job.owner, job.repo, job.ref);
        try {
            atualizarJob(jobId, { status: 'analisando' });
            const inicio = Date.now();
            const { totalArquivos, arquivosAnalisados, todasOcorrencias } = await executarAnaliseInterna(repoDir, job.options);
            const ocorrencias = simplificarOcorrencias(todasOcorrencias);
            const resultado = {
                totalArquivos,
                totalOcorrencias: ocorrencias.length,
                duracaoMs: Date.now() - inicio,
                arquivosAnalisados,
                ocorrencias,
                scoreGeral: calcularScoreGeral(totalArquivos, ocorrencias),
                resumoPorTipo: resumirPorTipo(ocorrencias),
                resumoPorSeveridade: resumirPorSeveridade(ocorrencias)
            };
            atualizarJob(jobId, {
                status: 'completo',
                finalizadoEm: Date.now(),
                resultado
            });
        }
        finally {
            cleanup();
        }
    });
}
//# sourceMappingURL=full-analysis-job.js.map