import type {Bud} from '@roots/bud-framework'
import type {Configuration} from '@roots/bud-framework/config'

import {BudError} from '@roots/bud-support/errors'
import isFunction from '@roots/bud-support/isFunction'

export type Parameters = [
  | ((config: Partial<Configuration>) => Partial<Configuration>)
  | ((config: Partial<Configuration>) => Promise<Partial<Configuration>>)
  | Partial<Configuration>,
]

export interface config {
  (...parameters: Parameters): Bud
}

export const config: config = function (this: Bud, input): Bud {
  if (!input)
    throw new BudError(
      `config input must pass a callback function that returns a webpack configuration`,
      {
        docs: new URL(`https://bud.js.org/docs/bud.config`),
        thrownBy: `bud.config`,
      },
    )

  this.hooks.action(`build.after`, async app => {
    if (!app) return

    app.build.config = isFunction(input)
      ? await input(app.build.config)
      : {...app.build.config, ...input}
  })

  return this
}
