const CompressionWebpackPlugin = require('compression-webpack-plugin');
const ThemeColorReplacer = require('webpack-theme-color-replacer');
const forElementUI = require('webpack-theme-color-replacer/forElementUI');
const themeUtil = require('webpack-theme-color-replacer/themeUtil');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const path = require('path'); // 确保引入 path 模块
const productionGzipExtensions = ['js', 'css'];

module.exports = {
  publicPath: '/',
  outputDir: 'dist', // 确保输出目录为 dist
  lintOnSave: true,
  productionSourceMap: false,
  chainWebpack: (config) => {
    const entry = config.entry('app');
    entry.add('babel-polyfill').add('classlist-polyfill').end();

    // 自定义换肤
    config
      .plugin('webpack-theme-color-replacer')
      .use(ThemeColorReplacer)
      .tap((options) => {
        options[0] = {
          matchColors: [
            ...forElementUI.getElementUISeries('#409EFF'), // element-ui 主色系列
            '#0cdd3a', // 自定义颜色
            '#c655dd'
          ], // 需要全 CSS 查找的颜色数组，支持 RGB 和 HSL。
          changeSelector: themeUtil.changeSelector,
          fileName: 'css/theme-colors-[contenthash:8].css', // 输出 CSS 文件名，支持 [contenthash] 和 [hash]。
          injectCss: false, // 将 CSS 文本注入到 JS 文件中，不需要再下载 `theme-colors-xxx.css`。
          isJsUgly: process.env.NODE_ENV !== 'development'
        };
        return options;
      });
  },
  css: {
    loaderOptions: {
      css: {
        url: {
          filter: (url, resourcePath) => {
            // 如果 URL 以 '/' 开头，则不让 Webpack 处理
            if (url.startsWith('/')) {
              return false;
            }
            return true;
          }
        }
      }
    }
  },
  configureWebpack: (config) => {
    if (process.env.NODE_ENV === 'production') {
      return {
        plugins: [
          new CompressionWebpackPlugin({
            // 修改 filename 配置，确保包含原始文件的扩展名，避免命名冲突
            filename: '[path][base].gz', // 使用 [base] 包含文件名及扩展名，如 index.js.gz
            algorithm: 'gzip',
            test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'),
            threshold: 1024, // 仅压缩大于1KB的文件
            minRatio: 0.99, // 压缩率低于0.99时启用
            deleteOriginalAssets: false // 建议保留原始文件，避免删除后可能导致的问题
          }),
          new MiniCssExtractPlugin({
            ignoreOrder: true // 忽略 CSS 顺序警告
          })
        ],
        // 可选：优化输出路径，确保所有文件输出到统一目录，避免路径冲突
        output: {
          filename: 'js/[name].[contenthash].js',
          chunkFilename: 'js/[name].[contenthash].js'
        },
        // 可选：增加 stats 以便调试
        stats: 'normal'
      };
    }
  },
  // 配置转发代理
  devServer: {
    client: {
      overlay: false
    },
    allowedHosts: 'all', // 替代 disableHostCheck: true，允许所有主机访问
    port: 8080,
    proxy: {
      '/': {
        target: process.env.VUE_APP_URL,
        ws: false, // 需要 WebSocket 时设置为 true
        pathRewrite: {
          '^/': '/'
        }
      }
      // 3.5 以后不需要再配置
    }
  }
};
