const { resolve } = require('path')
const { existsSync } = require('fs')
const consola = require('consola')
const esm = require('esm')(module, {
  cache: false,
  cjs: {
    cache: true,
    vars: true,
    namedExports: true
  }
})

const getRootDir = argv => resolve(argv._[0] || '.')
const getNuxtConfigFile = argv => resolve(getRootDir(argv), argv['config-file'])

exports.nuxtConfigFile = getNuxtConfigFile

exports.loadNuxtConfig = (argv) => {
  const rootDir = getRootDir(argv)
  const nuxtConfigFile = getNuxtConfigFile(argv)

  let options = {}

  if (existsSync(nuxtConfigFile)) {
    delete require.cache[nuxtConfigFile]
    options = esm(nuxtConfigFile)
    if (!options) {
      options = {}
    }
    if (options.default) {
      options = options.default
    }
  } else if (argv['config-file'] !== 'nuxt.config.js') {
    consola.fatal('Could not load config file: ' + argv['config-file'])
  }

  if (typeof options.rootDir !== 'string') {
    options.rootDir = rootDir
  }

  // Nuxt Mode
  options.mode =
    (argv['spa'] && 'spa') || (argv['universal'] && 'universal') || options.mode

  return options
}

exports.getLatestHost = (argv) => {
  const port =
    argv.port || process.env.PORT || process.env.npm_package_config_nuxt_port
  const host =
    argv.hostname ||
    process.env.HOST ||
    process.env.npm_package_config_nuxt_host

  return { port, host }
}