//
// build task definitions
//
// run any task with "yarn build ${taskName}"
//
global.globalThis = global // eslint-disable-line node/no-unsupported-features/es-builtins
require('lavamoat-core/lib/ses.umd.js')

lockdown() // eslint-disable-line no-undef

const livereload = require('gulp-livereload')
const {
  createTask,
  composeSeries,
  composeParallel,
  detectAndRunEntryTask,
} = require('./task')
const createManifestTasks = require('./manifest')
const createScriptTasks = require('./scripts')
const createStyleTasks = require('./styles')
const createStaticAssetTasks = require('./static')
const createEtcTasks = require('./etc')

const browserPlatforms = ['firefox', 'chrome', 'brave', 'opera']

defineAllTasks()
detectAndRunEntryTask()

function defineAllTasks() {
  const staticTasks = createStaticAssetTasks({ livereload, browserPlatforms })
  const manifestTasks = createManifestTasks({ browserPlatforms })
  const styleTasks = createStyleTasks({ livereload })
  const scriptTasks = createScriptTasks({ livereload, browserPlatforms })
  const { clean, reload, zip } = createEtcTasks({
    livereload,
    browserPlatforms,
  })

  // build for development (livereload)
  createTask(
    'dev',
    composeSeries(
      clean,
      styleTasks.dev,
      composeParallel(
        scriptTasks.dev,
        staticTasks.dev,
        manifestTasks.dev,
        reload,
      ),
    ),
  )

  // build for test development (livereload)
  createTask(
    'testDev',
    composeSeries(
      clean,
      styleTasks.dev,
      composeParallel(
        scriptTasks.testDev,
        staticTasks.dev,
        manifestTasks.testDev,
        reload,
      ),
    ),
  )

  // build for prod release
  createTask(
    'prod',
    composeSeries(
      clean,
      styleTasks.prod,
      composeParallel(scriptTasks.prod, staticTasks.prod, manifestTasks.prod),
      zip,
    ),
  )

  // build for CI testing
  createTask(
    'test',
    composeSeries(
      clean,
      styleTasks.prod,
      composeParallel(scriptTasks.test, staticTasks.prod, manifestTasks.test),
    ),
  )

  // special build for minimal CI testing
  createTask('styles', styleTasks.prod)
}
