import type { TransformOptions } from '@babel/core';
import type { LoaderOptions as WYWOptions } from '@wyw-in-js/webpack-loader';
import HtmlWebpackPlugin from 'html-webpack-plugin';
import { PluginOptions as MiniCssExtractPluginOptions } from 'mini-css-extract-plugin';
import type { Options as SassOptions } from 'sass-loader';
import type { Config as OptimizeOptions } from 'svgo';
import type { Options as TsconfigPathsOptions } from 'tsconfig-paths-webpack-plugin/lib/options';
import type {
  Configuration,
  RuleSetUseItem,
  RuleSetConditionAbsolute,
} from 'webpack';
import type { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';

export interface Options {
  rootPath?: string;
  basePath?: string;
  babelRoot?: string;
  libraryInclude?: RuleSetConditionAbsolute;
  libraryExclude?: RuleSetConditionAbsolute;
  buildDir?: string;
  serverDir?: string;
  manifestFilename?: string;
  mode?: Configuration['mode'];
  nohash?: boolean;
  argv?: any[];
  env?: any;
  htmlOptions?: HtmlWebpackPlugin.Options | false;
  svgoOptions?: OptimizeOptions | false;
  svgrOptions?:
    | { svgoConfig?: OptimizeOptions; [key: string]: unknown }
    | false;
  inJSOptions?: WYWOptions | false;
  cssExtractOptions?: MiniCssExtractPluginOptions | false;
  tsconfigPathsOptions?: TsconfigPathsOptions | false;
  globalStyleDir?: string | false;
  sassOptions?: SassOptions | false;
  sassResources?: string[];
  cssModuleOptions?: any;
  fontPreload?: 'preload' | 'prefetch';
  bundleAnalyzerOptions?: BundleAnalyzerPlugin.Options;
  babelLoader?: TransformOptions & {
    cacheDirectory?: string;
    cacheIdentifier?: any;
    cacheCompression?: boolean;
    customize?: any;
    metadataSubscribers?: any[];
  }; // babel loader options
  extraJsLoaders?: RuleSetUseItem[];
}

export function makeConfig(
  options: Options,
): (env: any, argv: any[]) => Configuration;
export function makeStorybookConfigGenerator(
  baseConfig: Configuration,
): ({ config: Configuration, mode: string }) => Configuration;
