import { carregarConfigDeDiretorio } from '../../../core/config/index.js';
import { obterConfigInstalacao } from '../app/installation-store.js';
import { downloadRepo } from '../app/repo-downloader.js';
import { calcularScoreGeral, executarAnaliseInterna, resumirPorSeveridade, resumirPorTipo } from '../jobs/full-analysis-job.js';
function simplificarOcorrencias(ocorrencias) {
    return ocorrencias.map(o => ({
        mensagem: typeof o.mensagem === 'string' ? o.mensagem : String(o.mensagem ?? ''),
        relPath: typeof o.relPath === 'string' ? o.relPath : String(o.relPath ?? ''),
        tipo: typeof o.tipo === 'string' ? o.tipo : undefined,
        nivel: typeof o.nivel === 'string' ? o.nivel : undefined,
        linha: typeof o.linha === 'number' ? o.linha : undefined,
        coluna: typeof o.coluna === 'number' ? o.coluna : undefined,
        sugestao: typeof o.sugestao === 'string' ? o.sugestao : undefined
    }));
}
export async function listarArquivosAlterados(octokit, owner, repo, beforeSha, afterSha) {
    if (!beforeSha || beforeSha === '0000000000000000000000000000000000000000') {
        return [];
    }
    try {
        const { data } = await octokit.request('GET /repos/{owner}/{repo}/compare/{basehead}', {
            owner,
            repo,
            basehead: `${beforeSha}...${afterSha}`
        });
        return (data.files ?? [])
            .filter((f) => f.status !== 'removed' && typeof f.filename === 'string')
            .map(f => f.filename);
    }
    catch {
        return [];
    }
}
function filtrarOcorrenciasPorArquivos(ocorrencias, arquivos) {
    if (arquivos.length === 0)
        return ocorrencias;
    const set = new Set(arquivos);
    return ocorrencias.filter(o => set.has(o.relPath));
}
export async function rodarAnaliseCodigo(app, params) {
    const config = obterConfigInstalacao(params.installationId);
    const octokit = await app.getInstallationOctokit(params.installationId);
    const inicio = Date.now();
    const { repoDir, cleanup } = await downloadRepo(app, params.installationId, params.owner, params.repo, params.headSha);
    try {
        await carregarConfigDeDiretorio(repoDir);
        const { totalArquivos, arquivosAnalisados, todasOcorrencias } = await executarAnaliseInterna(repoDir, { fast: params.fast ?? config.fast });
        let ocorrencias = simplificarOcorrencias(todasOcorrencias);
        let arquivosAlterados = [];
        const usarIncremental = params.incremental ?? config.incrementalOnPush;
        if (usarIncremental && params.baseSha) {
            arquivosAlterados = await listarArquivosAlterados(octokit, params.owner, params.repo, params.baseSha, params.headSha);
            if (arquivosAlterados.length > 0) {
                ocorrencias = filtrarOcorrenciasPorArquivos(ocorrencias, arquivosAlterados);
            }
        }
        const resultado = {
            totalArquivos,
            totalOcorrencias: ocorrencias.length,
            duracaoMs: Date.now() - inicio,
            arquivosAnalisados,
            ocorrencias,
            scoreGeral: calcularScoreGeral(totalArquivos, ocorrencias),
            resumoPorTipo: resumirPorTipo(ocorrencias),
            resumoPorSeveridade: resumirPorSeveridade(ocorrencias)
        };
        const ctx = {
            branch: params.branch,
            headSha: params.headSha,
            commitMessage: params.commitMessage,
            owner: params.owner,
            repo: params.repo,
            arquivosAlterados: arquivosAlterados.length > 0 ? arquivosAlterados : undefined,
            escopoIncremental: usarIncremental && arquivosAlterados.length > 0,
            origem: params.baseSha ? 'pull_request' : 'push'
        };
        return { resultado, ctx, cleanup };
    }
    catch (err) {
        cleanup();
        throw err;
    }
}
//# sourceMappingURL=analysis-core.js.map