const path = require('path');
const webpack = require('webpack');
const CopyPlugin = require('copy-webpack-plugin');
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');

module.exports = function (env) {
  return {
    mode: env.production ? 'production' : 'development',
    devtool: env.production ? undefined : 'eval-source-map',
    entry: {
      background: [
        path.resolve(__dirname, 'src/chromeApiMock'),
        path.resolve(__dirname, 'src/background/index'),
      ],
      options: [
        path.resolve(__dirname, 'src/chromeApiMock'),
        path.resolve(__dirname, 'src/options/index'),
      ],
      window: [path.resolve(__dirname, 'src/window/index')],
      remote: [path.resolve(__dirname, 'src/remote/index')],
      devpanel: [
        path.resolve(__dirname, 'src/chromeApiMock'),
        path.resolve(__dirname, 'src/devpanel/index'),
      ],
      devtools: path.resolve(__dirname, 'src/devtools/index'),
      content: [
        path.resolve(__dirname, 'src/chromeApiMock'),
        path.resolve(__dirname, 'src/contentScript/index'),
      ],
      page: path.join(__dirname, 'src/pageScript'),
      ...(env.production
        ? {}
        : { pagewrap: path.resolve(__dirname, 'src/pageScriptWrap') }),
    },
    output: {
      filename: '[name].bundle.js',
    },
    plugins: [
      new webpack.DefinePlugin({
        'process.env.BABEL_ENV': JSON.stringify(process.env.NODE_ENV),
      }),
      new ForkTsCheckerWebpackPlugin({
        typescript: {
          configFile: 'tsconfig.json',
        },
      }),
      new CopyPlugin({
        patterns: [
          {
            from: path.join(__dirname, 'chrome/manifest.json'),
            to: path.join(__dirname, 'dist/manifest.json'),
          },
          {
            from: path.join(__dirname, 'src/assets'),
            to: path.join(__dirname, 'dist'),
          },
        ],
      }),
    ],
    resolve: {
      extensions: ['.js', '.jsx', '.ts', '.tsx'],
    },
    module: {
      rules: [
        {
          test: /\.(js|ts)x?$/,
          use: 'babel-loader',
          exclude: /node_modules/,
        },
        {
          test: /\.css?$/,
          use: ['style-loader', 'css-loader'],
        },
        {
          test: /\.pug$/,
          use: ['file-loader?name=[name].html', 'pug-html-loader'],
        },
      ],
    },
  };
};