export function extrairSinaisProjeto(fileEntries, packageJson) {
    const hasIdNome = (node) => {
        return typeof node === 'object' && node !== null && 'id' in node && typeof node.id?.name === 'string';
    };
    const sinais = {
        funcoes: 0,
        imports: [],
        variaveis: 0,
        tipos: [],
        classes: 0,
        frameworksDetectados: [],
        dependencias: [],
        scripts: [],
        pastasPadrao: [],
        arquivosPadrao: [],
        arquivosConfiguracao: [],
        padroesArquiteturais: [],
        tecnologiasDominantes: [],
        complexidadeEstrutura: 'baixa',
        tipoDominante: 'desconhecido'
    };
    for (const fe of fileEntries) {
        let body = [];
        if (fe.ast && 'node' in fe.ast && fe.ast.node && fe.ast.node.type === 'Program' && Array.isArray(fe.ast.node.body)) {
            body = fe.ast.node.body;
        }
        sinais.funcoes += body.filter((node) => node.type === 'FunctionDeclaration').length;
        const imports = body.filter((node) => node.type === 'ImportDeclaration');
        sinais.imports.push(...imports.map(indice => indice.source.value));
        sinais.variaveis += body.filter((node) => node.type === 'VariableDeclaration').length;
        sinais.tipos.push(...body.filter((node) => ['TSTypeAliasDeclaration', 'TSInterfaceDeclaration', 'TSEnumDeclaration'].includes(node.type)).map(node => hasIdNome(node) ? node.id.name : undefined).filter((valor) => typeof valor === 'string'));
        sinais.classes += body.filter((node) => node.type === 'ClassDeclaration').length;
        for (const indice of imports) {
            if (typeof indice.source.value === 'string') {
                if (/express|react|next|electron|discord\.js|telegraf/.test(indice.source.value)) {
                    sinais.frameworksDetectados.push(indice.source.value);
                }
            }
        }
        const rel = fe.relPath.replace(/\\/g, '/');
        if (/src\/controllers|pages|api|prisma|packages|apps/.test(rel)) {
            sinais.pastasPadrao.push(rel);
        }
        if (/main\.js|index\.ts|bot\.ts|electron\.js/.test(rel)) {
            sinais.arquivosPadrao.push(rel);
        }
        if (/tsconfig\.json|turbo\.json|pnpm-workspace\.yaml/.test(rel)) {
            sinais.arquivosConfiguracao.push(rel);
        }
    }
    if (packageJson) {
        sinais.dependencias.push(...Object.keys(packageJson.dependencies || {}));
        sinais.scripts.push(...Object.keys(packageJson.scripts || {}));
    }
    sinais.imports = Array.from(new Set(sinais.imports));
    sinais.frameworksDetectados = Array.from(new Set(sinais.frameworksDetectados));
    sinais.pastasPadrao = Array.from(new Set(sinais.pastasPadrao));
    sinais.arquivosPadrao = Array.from(new Set(sinais.arquivosPadrao));
    sinais.arquivosConfiguracao = Array.from(new Set(sinais.arquivosConfiguracao));
    sinais.tipos = Array.from(new Set(sinais.tipos));
    return sinais;
}
export const extrairSinais = extrairSinaisProjeto;
//# sourceMappingURL=signals-project.js.map