/* eslint-disable @typescript-eslint/no-var-requires */
var path = require('path');
var webpack = require('webpack');
var MiniCssExtractPlugin = require('mini-css-extract-plugin');
var HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = (env, argv) => {
    const isDevServer = (env || {}).devServer === true;
    const runInContainer = (env || {}).runInContainer === true;
    const isDevelopment = argv.mode === 'development';
    const outputDirectory = isDevServer ? "dist-dev" : "dist";
    const entries = {};
    entries[`${outputDirectory}/engine`] = "./src/engine.jsx";
    entries[`${outputDirectory}/engineStyle`] = "./src/engineStyle.js";

    const statsConfig = {
        builtAt: true,
        children: false,
        chunks: false,
        chunkGroups: false,
        chunkModules: false,
        chunkOrigins: false,
        colors: true,
        entrypoints: true,
    }

    const devServerSettings = {
        port: 8000,
        publicPath: `/`,
        stats: statsConfig,
    };

    // By default, the webpack-dev-server is not exposed outside of localhost.
    // When running in a container we need it accessible externally.
    if (runInContainer) {
        devServerSettings.disableHostCheck = true;
        devServerSettings.host = '0.0.0.0';
        devServerSettings.watchOptions = {
            poll: true,
        }
    }

    return {
        plugins: [
            new webpack.DefinePlugin({
                'process.env.NODE_ENV': isDevelopment ? "\"development\"" : "\"production\"",
            }),
            // http://stackoverflow.com/questions/29080148/expose-jquery-to-real-window-object-with-webpack
            new webpack.ProvidePlugin({
                // Automtically detect jQuery and $ as free var in modules
                // and inject the jquery library
                // This is required by many jquery plugins
                jquery: "jquery",
                jQuery: "jquery",
                $: "jquery",
            }),
            new HtmlWebpackPlugin({
                title: "Bitburner" + (isDevelopment ? ' - development' : ""),
                template: "src/index.html",
                favicon: "favicon.ico",
                googleAnalytics: {
                    trackingId: 'UA-100157497-1',
                },
                meta: {},
                minify: isDevelopment ? false : {
                    collapseBooleanAttributes: true,
                    collapseInlineTagWhitespace: false,
                    collapseWhitespace: false,
                    conservativeCollapse: false,
                    html5: true,
                    includeAutoGeneratedTags: false,
                    keepClosingSlash: true,
                    minifyCSS: false,
                    minifyJS: false,
                    minifyURLs: false,
                    preserveLineBreaks: false,
                    preventAttributesEscaping: false,
                    processConditionalComments: false,
                    quoteCharacter: "\"",
                    removeAttributeQuotes: false,
                    removeComments: false,
                    removeEmptyAttributes: false,
                    removeEmptyElements: false,
                    removeOptionalTags: false,
                    removeScriptTypeAttributes: false,
                    removeStyleLinkTypeAttributes: false,
                    removeTagWhitespace: false,
                    sortAttributes: false,
                    sortClassName: false,
                    useShortDoctype: false,
                },
            }),
            new MiniCssExtractPlugin({
                filename: "[name].css",
            }),
        ],
        target: "web",
        entry: entries,
        devtool: "source-map",
        output: {
            path: path.resolve(__dirname, "./"),
            filename: "[name].bundle.js",
        },
        module: {
            rules: [
                {
                    test: /\.tsx?$/,
                    loader: 'ts-loader',
                    exclude: /node_modules/,
                },
                {
                    test: /\.(jsx)$/,
                    exclude: /node_modules/,
                    use: {
                      loader: "babel-loader",
                    },
                },
                {
                    test: /\.s?css$/,
                    use: [
                        MiniCssExtractPlugin.loader,
                        "css-loader",
                        "sass-loader",
                    ],
                },
            ],
        },
        optimization: {
            removeAvailableModules: true,
            removeEmptyChunks: true,
            mergeDuplicateChunks: true,
            flagIncludedChunks: true,
            occurrenceOrder: true,
            sideEffects: true,
            providedExports: true,
            usedExports: true,
            concatenateModules: false,
            namedModules: false,
            namedChunks: false,
            minimize: !isDevelopment,
            portableRecords: true,
            splitChunks: {
                cacheGroups: {
                    vendor: {
                        test: /[\\/]node_modules[\\/]/,
                        name: `${outputDirectory}/vendor`,
                        chunks: 'all',
                    },
                },
            },
        },
        devServer: devServerSettings,
        resolve: {
            extensions: [
                ".tsx",
                ".ts",
                ".js",
                ".jsx",
            ],
        },
        stats: statsConfig,
    };
};