const path = require('path');
const fs = require('fs');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const TerserPlugin = require('terser-webpack-plugin');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const ProgressBarPlugin = require('progress-bar-webpack-plugin');
const { readdirSync } = require('fs');

// const tailPkgs = readdirSync(path.join(__dirname, 'packages')).filter(
//   (pkg) => pkg.charAt(0) !== '.',
// );
const tailPkgs = ['base-components', 'extend-components']
  .map((dir) => {
    const list = readdirSync(path.join(__dirname, 'packages', dir)).map((item) => `${item}!${dir}`);
    return list.filter((pkg) => pkg.charAt(0) !== '.');
  })
  .flat();
const isCI = process.env.PRO_COMPONENTS_CI === 'CI';

const externals = isCI
  ? tailPkgs.reduce((pre, value) => {
      const [name] = value.split('!');
      return {
        ...pre,
        [`@ant-design/pro-${name}`]: `Pro${name
          .toLowerCase()
          .replace(/( |^)[a-z]/g, (L) => L.toUpperCase())}`,
      };
    }, {})
  : {};

const webPackConfigList = [];

// eslint-disable-next-line consistent-return
tailPkgs.forEach((pkg) => {
  const [name, p] = pkg.split('!');
  if (name === 'ParseForm') return false;
  const entry = {};
  entry[`${name}`] = `./packages/${p}/${name}/src/index.js`;
  entry[`${name}.min`] = `./packages/${p}/${name}/src/index.js`;

  const config = {
    entry,
    output: {
      filename: '[name].js',
      library: `WisDOM${name.toLowerCase().replace(/( |^)[a-z]/g, (L) => L.toUpperCase())}`,
      libraryExport: 'default',
      path: path.resolve(__dirname, 'packages', p, name, 'dist'),
      globalObject: 'this',
    },
    mode: 'production',
    resolve: {
      extensions: ['.json', '.css', '.js', '.less'],
    },
    optimization: isCI
      ? {
          minimize: true,
          minimizer: [
            new TerserPlugin({
              include: /\.min\.js$/,
            }),
            new OptimizeCSSAssetsPlugin({
              include: /\.min\.js$/,
            }),
          ],
        }
      : undefined,
    module: {
      rules: [
        {
          test: /\.(png|jpg|gif|svg)$/i,
          use: [
            {
              loader: 'url-loader',
              options: {
                limit: 8192,
              },
            },
          ],
        },
        {
          test: /\.jsx?$/,
          use: {
            loader: 'babel-loader',
            options: {
              presets: ['@babel/typescript', '@babel/env', '@babel/react'],
              plugins: [
                ['@babel/plugin-proposal-decorators', { legacy: true }],
                ['@babel/plugin-proposal-class-properties', { loose: true }],
                '@babel/proposal-object-rest-spread',
              ],
            },
          },
        },
        {
          test: /\.jsx?$/,
          exclude: /(node_modules|bower_components)/,
          use: {
            loader: 'babel-loader',
            options: {
              presets: [
                '@babel/typescript',
                [
                  '@babel/env',
                  {
                    loose: true,
                    modules: false,
                  },
                ],
                '@babel/react',
              ],
              plugins: [
                ['@babel/plugin-proposal-decorators', { legacy: true }],
                ['@babel/plugin-proposal-class-properties', { loose: true }],
                '@babel/proposal-object-rest-spread',
              ],
            },
          },
        },
        {
          test: /\.css$/,
          use: [
            {
              loader: 'style-loader', // creates style nodes from JS strings
            },
            {
              loader: 'css-loader', // translates CSS into CommonJS
            },
          ],
        },
        {
          test: /\.less$/,
          use: [
            {
              loader: MiniCssExtractPlugin.loader,
              options: {
                publicPath: (resourcePath, context) =>
                  `${path.relative(path.dirname(resourcePath), context)}/`,
              },
            },
            {
              loader: 'css-loader', // translates CSS into CommonJS
            },
            {
              loader: 'less-loader',
              options: {
                lessOptions: {
                  javascriptEnabled: true,
                },
              },
            },
          ],
        },
      ],
    },
    externals: [
      {
        react: 'React',
        'react-dom': 'ReactDOM',
        antd: 'antd',
        moment: 'moment',
        ...externals,
      },
    ],
    plugins: [
      new ProgressBarPlugin(),
      new MiniCssExtractPlugin({
        filename: '[name].css',
        chunkFilename: '[id].css',
      }),
    ],
  };
  webPackConfigList.push(config);
});

module.exports = webPackConfigList;
