import cluster from 'cluster'
import Util from './util.mjs'
import fs from 'fs/promises'
import getLog, { getDefaultStreams } from './log.mjs'
import GetDB from './db.mjs'
import Core from './core.mjs'


export async function runner(root_import_meta_url, configname = 'config.json', dbname = 'db.json') {
  if (!root_import_meta_url) {
    throw new Error('ServiceRunner must be called with the full string from "import.meta.url" from a file residing in the root directory')
  }
  const util = new Util(root_import_meta_url)

  let config = configname
  if (typeof(config) === 'string') {
    let fullpath = util.getPathFromRoot('./' + config)

    try {
      config = JSON.parse(await fs.readFile(fullpath))
    } catch (err) {
      throw new Error(`critical error opening ${fullpath}: ${err.message}`)
    }
  }

  let streams = getDefaultStreams()

  if (cluster.isWorker) {
    streams[0].level = 'error'
  }
  
  const log = getLog(config.name, streams)
  runner.log = log
  const db = await GetDB(config, log, util.getPathFromRoot('./' + dbname))
  
  const core = new Core(db, util, log, function(msg) {
    let err = new Error('Got request to restart' + (msg ? ': ' + msg : ''))
    runner.log.fatal(err)
    process.exit(0)
  })
  await core.init()
  await core.run()

  return core
}

runner.log = getLog('runner')
