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) => {
  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)
}