const {initialiseData, setupDatastore} = require("@budibase/core");
const constructHierarchy  = require("../utilities/constructHierarchy");
const getDatabaseManager = require("../utilities/databaseManager"); 
const {getApisForUser, getApisWithFullAccess} = require("../utilities/budibaseApi");  
const masterDbAppDefinition = require("../appPackages/_master/appDefinition.json");
const masterDbAccessLevels = require("../appPackages/_master/access_levels.json");
const { masterAppPackage } = require("../utilities/createAppPackage");

module.exports = async (context, datastoreModule, username, password) => {
    try {
        const { config } = context;
        const databaseManager = getDatabaseManager(
            datastoreModule, config.datastoreConfig);
        
        await databaseManager.createEmptyMasterDb();
        const masterDbConfig = databaseManager.masterDatastoreConfig;
        const datastore = setupDatastore(
            datastoreModule.getDatastore(masterDbConfig)
        );

        await initialiseData(datastore, 
            constructHierarchy(masterDbAppDefinition));

        const masterPackage = masterAppPackage(context); 
        const bbMaster = await getApisWithFullAccess(
            datastore, masterPackage);
        await bbMaster.authApi.saveAccessLevels(masterDbAccessLevels);
        const user = bbMaster.authApi.getNewUser();
        user.name = username;
        user.accessLevels= ["owner"];
        await bbMaster.authApi.createUser(user, password);
        
        return await getApisForUser(
            datastore, 
            masterPackage, 
            username, 
            password);
    } catch(e) {
        throw e;
    }
};