const { resolve, join } = require("path");
const constructHierarchy = require("./constructHierarchy");
const { common } = require("budibase-core");
const { getRuntimePackageDirectory } = require("../utilities/runtimePackages");
const injectPlugins = require("./injectedPlugins");
const { cwd } = require("process"); 

const createAppPackage = (context, appPath) => {

    const appDefModule = require(
        join(appPath, "appDefinition.json"));

    const pluginsModule = require(
        join(appPath, "plugins.js"));

    const accessLevels = require(
        join(appPath, "access_levels.json")
    );
        
    return ({
        appDefinition: appDefModule,
        behaviourSources: pluginsModule(context),
        appPath,
        accessLevels
    })
}

const appPackageFolder = (config, appname) => 
    resolve(cwd(), config.latestPackagesFolder, appname);

module.exports.appPackageFolder = appPackageFolder;

module.exports.appsFolder = (config) => appPackageFolder(config, "");

module.exports.masterAppPackage = (context) => {
    const { config } = context;
    const standardPackage = createAppPackage(
        context, "../appPackages/master");

    const customizeMaster = config && config.customizeMaster 
                            ? config.customizeMaster
                            : a => a;

    const appDefinition = common.$(standardPackage.appDefinition, [
        customizeMaster,
        constructHierarchy
    ]);

    const plugins = standardPackage.behaviourSources;

    return ({
        appDefinition,
        behaviourSources: config && config.extraMasterPlugins
                          ? {...plugins, ...config.extraMasterPlugins}
                          : plugins,
        appPath: standardPackage.appPath
    });
}
    
module.exports.applictionVersionPackage = async (context, appname, versionId, instanceKey) => {
    const pkg = createAppPackage(
        context,
        join("..", getRuntimePackageDirectory(appname, versionId))
    );
    pkg.appDefinition = constructHierarchy(pkg.appDefinition);
    await injectPlugins(
        pkg,
        context.master,
        appname,
        instanceKey);
    return pkg;
}
