// Copyright © Roots Software LLC
// Licensed under the MIT license.

/**
 * @roots/sage
 *
 * @see https://github.com/roots/bud
 * @see https://github.com/roots/sage
 */

import type {Item, Loader, Rule} from '@roots/bud-build'
import type {ExtensionApi} from '@roots/bud-framework/extension'
import type BudPresetWordPress from '@roots/bud-preset-wordpress/extension'
import type Acorn from '@roots/sage/acorn'
import type AcornV2PublicPath from '@roots/sage/acorn-v2-public-path'
import type BladeLoader from '@roots/sage/blade-loader'

import Sage from '@roots/sage/sage'

interface SagePublicAPI
  extends ExtensionApi<
    {
      acorn: Acorn
      blade: BladeLoader
      processBladeTemplates: Sage[`processBladeTemplates`]
      setAcornVersion: Sage[`setAcornVersion`]
    },
    Sage
  > {
  /**
   * ## Configure Acorn concerns
   *
   * @see {@link Acorn}
   * @see {@link https://bud.js.org/extensions/sage#acorn-compatibility}
   */
  acorn: Acorn

  /**
   * ## Configure handling of Blade template modules
   *
   * @see {@link BladeLoader}
   * @see {@link https://bud.js.org/extensions/sage/blade-assets}
   */
  blade: BladeLoader

  /**
   * ## Enable or disable Blade template processing
   *
   * @remarks
   * This method is a convenience wrapper for the {@link BladeLoader.enable} method.
   *
   * @example
   * ```js
   * bud.sage.processBladeTemplates()
   * ```
   *
   * @example
   * ```js
   * bud.sage.processBladeTemplates(false)
   * ```
   *
   * @example
   * ```js
   * bud.when(bud.isProduction, bud.sage.processBladeTemplates)
   * ```
   *
   * @see {@link https://bud.js.org/extensions/sage/blade-assets}
   */
  processBladeTemplates: Sage[`processBladeTemplates`]

  /**
   * This function should be removed from your configuration file.
   * It doesn't do anything and will be removed in a future release.
   *
   * @deprecated
   */
  setAcornVersion: Sage[`setAcornVersion`]
}

declare module '@roots/bud-framework' {
  interface Bud {
    /**
     * ## Sage configuration
     *
     * @see {@link https://bud.js.org/extensions/sage}
     * @see {@link https://docs.roots.io/sage/10.x/compiling-assets}
     */
    sage: SagePublicAPI
  }

  interface Modules {
    '@roots/bud-preset-wordpress': BudPresetWordPress
    '@roots/sage': Sage
    '@roots/sage/acorn': Acorn
    '@roots/sage/acorn-v2-public-path'?: AcornV2PublicPath
    '@roots/sage/blade-loader': BladeLoader
  }

  interface Locations {
    '@fonts': string
    '@images': string
    '@public': string
    '@resources': string
    '@scripts': string
    '@styles': string
    '@views': string
  }

  interface Loaders {
    '@roots/blade-loader': Loader
  }

  interface Items {
    '@roots/blade-loader': Item
  }

  interface Rules {
    blade: Rule
  }
}

export {Sage as default}
export type {SagePublicAPI}
