const webpack = require("webpack");
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
// const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;
const UglifyJSPlugin = require("uglifyjs-webpack-plugin");
const CopyWebpackPlugin = require("copy-webpack-plugin");
const CompressionPlugin = require("compression-webpack-plugin");

const config = {
    entry: {
        app: path.join(__dirname, "client", "index.js"),
    },
    output: {
        path: path.join(__dirname, "server", "ctrl", "static", "www"),
        publicPath: "/",
        filename: "assets/js/[name]_[chunkhash].js",
        chunkFilename: "assets/js/chunk_[name]_[id]_[chunkhash].js",
    },
    module: {
        rules: [
            {
                test: path.join(__dirname, "client"),
                use: ["babel-loader"],
                exclude: /node_modules/,
            },
            {
                test: /\.html$/,
                use: "html-loader",
            },
            {
                test: /\.woff2$/,
                use: "woff-loader",
            },
            {
                test: /\.scss$/,
                use: [
                    { loader: "style-loader" },
                    { loader: "css-loader" },
                    { loader: "sass-loader" },
                ],
            },
            {
                test: /\.css$/,
                use: [
                    { loader: "style-loader" },
                    { loader: "css-loader" },
                ],
            },
            {
                test: /\.(pdf|jpg|png|gif|svg|ico|woff|woff2|eot|ttf)$/,
                loader: "url-loader",
            },
            {
                test: /[a-z]+\.worker\.js$/,
                loader: "worker-loader",
                options: { name: "assets/js/[name]_[hash].js" },
            },
        ],
    },
    plugins: [
        new webpack.DefinePlugin({
            "process.env.NODE_ENV": JSON.stringify(process.env.NODE_ENV),
        }),
        new HtmlWebpackPlugin({
            template: path.join(__dirname, "client", "index.html"),
            inject: true,
            minify: {
                collapseWhitespace: true,
                removeComments: true,
                minifyJS: true,
                minifyCSS: true,
            },
        }),
        new CopyWebpackPlugin([
            { from: "locales/*.json", to: "assets/" },
            { from: "worker/*.js", to: "assets/" },
            { from: "assets/logo/*" },
            { from: "assets/img/*" },
            { from: "assets/icons/*" },
            { from: "assets/fonts/*" },
        ], { context: path.join(__dirname, "client") }),
        new CopyWebpackPlugin([
            { from: "node_modules/pdfjs-dist/build/*.js", to: "assets/vendor/" },
            { from: "node_modules/pdfjs-dist/cmaps/*", to: "assets/vendor/" },
        ]),
        // new BundleAnalyzerPlugin()
    ],
    resolve: {
        fallback: {
            "path": require.resolve("path-browserify"),
            "crypto": require.resolve("crypto-browserify"),
            "buffer": require.resolve("buffer/"),
            "stream": require.resolve("stream-browserify"),
        },
    },
    mode: process.env.NODE_ENV || "production",
};


if (process.env.NODE_ENV === "production") {
    config.plugins.push(new UglifyJSPlugin({
        sourceMap: false,
        extractComments: true,
    }));
    config.plugins.push(new CompressionPlugin({
        asset: "[path].gz[query]",
        algorithm: "gzip",
        test: /\.js$|\.json$|\.html$|\.svg|\.ico$/,
        threshold: 0,
        minRatio: 0.8,
    }));
    config.plugins.push(new CompressionPlugin({
        asset: "[path].br[query]",
        algorithm: "brotliCompress",
        test: /\.js$|\.json$|\.html$|\.svg|\.ico$/,
        threshold: 0,
        minRatio: 0.8,
    }));
} else {
    config.devtool = "inline-source-map";
}

module.exports = config;
