const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const WasmPackPlugin = require('@wasm-tool/wasm-pack-plugin');

const path = require('path');
const fs = require('fs');

module.exports = (env = {}) => {
    const config = {
        entry: './src/index.js',
        output: {
            path: path.join(__dirname, 'dist'),
            filename: 'index.js',
            clean: true,
        },
        mode: 'development',
        resolve: {
            alias: {
                rustpython: path.resolve(
                    __dirname,
                    env.rustpythonPkg || '../../crates/wasm/pkg',
                ),
            },
        },
        module: {
            rules: [
                {
                    test: /\.css$/,
                    use: [MiniCssExtractPlugin.loader, 'css-loader'],
                },
                {
                    resourceQuery: '?raw',
                    type: 'asset/source',
                },
                {
                    test: /\.wasm$/,
                    type: 'webassembly/async',
                },
            ],
        },
        plugins: [
            new HtmlWebpackPlugin({
                filename: 'index.html',
                template: 'src/index.ejs',
                templateParameters: {
                    snippets: fs
                        .readdirSync(path.join(__dirname, 'snippets'))
                        .map((filename) =>
                            path.basename(filename, path.extname(filename)),
                        ),
                    defaultSnippetName: 'fibonacci',
                    defaultSnippet: fs.readFileSync(
                        path.join(__dirname, 'snippets/fibonacci.py'),
                    ),
                },
            }),
            new MiniCssExtractPlugin({
                filename: 'styles.css',
            }),
        ],
        experiments: {
            asyncWebAssembly: true,
        },
    };
    if (!env.noWasmPack) {
        config.plugins.push(
            new WasmPackPlugin({
                crateDirectory: path.join(__dirname, '../../crates/wasm'),
            }),
        );
    }
    return config;
};
