process.env.NODE_ENV = "production"
const path = require("path")
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin")
const { merge } = require("webpack-merge")
const commonConfig = require("./webpack.common")
const MiniCssExtractPlugin = require("mini-css-extract-plugin")
const CopyPlugin = require("copy-webpack-plugin")
const TerserPlugin = require("terser-webpack-plugin")
const SpeedMeasurePlugin = require("speed-measure-webpack-plugin")
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin

const isSMP = process.env.smp == "true"
const isAnalyze = process.env.analyze == "true"

const miniCssExtractPluginConfig =  new MiniCssExtractPlugin({
  filename: "static/css/[name]_[chunkhash:4].css"
})

let _prodConfig = {
  mode: "production",
  stats: "errors-only",
  devtool: "source-map",
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          MiniCssExtractPlugin.loader,
          "style-loader",
          "css-loader",
          {
            loader: "postcss-loader",
            options: {
              postcssOptions: {
                plugins: [["autoprefixer"]],
              },
            },
          },
        ],
      },
      {
        test: /\.scss$/,
        use: [
          MiniCssExtractPlugin.loader,
          "css-loader",
          {
            loader: "postcss-loader",
            options: {
              postcssOptions: {
                plugins: [["autoprefixer"]],
              },
            },
          },
          "sass-loader",
        ],
      },
    ],
  },
  optimization: {
    minimize: true,
    minimizer: [
      new CssMinimizerPlugin({
        include: "src",
      }),
      new TerserPlugin({
        extractComments: false,
        include: "src",
      }),
    ],
    splitChunks: {
      chunks: "all",
      minSize: 20000,
      minChunks: 1,
      maxAsyncRequests: 6,
      maxInitialRequests: 8,
      automaticNameDelimiter: "~",
      // name: true,
      cacheGroups: {
        locallibs: {
          test: /[\\/]node_modules[\\/](react|react-dom|redux|react-redux|react-router-dom|antd)[\\/]/,
          name: "locallibs",
          priority: -4,
        },
        localuis: {
          test: /[\\/]node_modules[\\/](@ant-design|moment)[\\/]/,
          name: "localuis",
          priority: -5,
        },
        localmobileuis: {
          test: /[\\/]node_modules[\\/](antd-mobile)[\\/]/,
          name: "localmobileuis",
          priority: -6,
        },
        localcharts: {
          test: /[\\/]node_modules[\\/](echarts|echarts-gl|echarts-for-react)[\\/]/,
          name: "localcharts",
          priority: -7,
        },
        localvideos: {
          test: /[\\/]node_modules[\\/](xgplayer|xgplayer-flv|flv.js)[\\/]/,
          name: "localvideos",
          priority: -8,
        },
        localmaps: {
          test: /[\\/]node_modules[\\/](leaflet|leaflet.chinatmsproviders)[\\/]/,
          name: "localmaps",
          priority: -9,
        },
        vendors: {
          test: /[\\/]node_modules[\\/]/,
          name: "vendors",
          priority: -10,
        },
        default: {
          name: "default",
          minChunks: 2,
          priority: -20,
          reuseExistingChunk: true,
        },
      },
    },
  },
  plugins: [
    miniCssExtractPluginConfig,
    new CopyPlugin({
      patterns: [
        {
          from: "public/static/",
          to: "static/",
        },
        {
          from: "release",
          to: "static/",
        },
      ],
    }),
    isAnalyze && new BundleAnalyzerPlugin(),
  ].filter(Boolean),
}

let prodConfig = merge(commonConfig, _prodConfig)

if (!isSMP) {
  module.exports = prodConfig
} else {
  // 处理SpeedMeasurePlugin兼容问题
  let index = prodConfig.plugins.findIndex(plugin => {
    return plugin === miniCssExtractPluginConfig
  })
  prodConfig.plugins.splice(index, 1)
  const smp = new SpeedMeasurePlugin()
  prodConfig = smp.wrap(prodConfig)
  prodConfig.plugins.push(miniCssExtractPluginConfig)
  module.exports = prodConfig
}