/**
 * COMMON WEBPACK CONFIGURATION
 */

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

module.exports = options => ({
	mode: options.mode,
	entry: options.entry,
	output: Object.assign(
		{
			// Compile into js/build.js
			path: path.resolve(process.cwd(), 'build'),
			publicPath: '/',
		},
		options.output,
	), // Merge with env dependent settings
	optimization: options.optimization,
	module: {
		rules: [
			{
				test: /\.jsx?$/, // Transform all .js and .jsx files required somewhere with Babel
				exclude: [/node_modules/, /assets_for_export/],
				use: {
					loader: 'babel-loader',
					options: options.babelQuery,
				},
			},
			{
				// Preprocess our own .css files
				// This is the place to add your own loaders (e.g. sass/less etc.)
				// for a list of loaders, see https://webpack.js.org/loaders/#styling
				test: /\.css$/,
				exclude: [/node_modules/, /assets_for_export/],
				use: ['style-loader', 'css-loader'],
			},
			{
				test: /\.(jpg|png|gif|ico)$/,
				include: /assets_for_export/,
				use: [
					{
						loader: 'url-loader',
					},
				],
			},
			{
				// Preprocess 3rd party .css files located in node_modules
				test: /\.css$/,
				include: /node_modules/,
				use: ['style-loader', 'css-loader'],
			},
			{
				test: /\.(eot|otf|ttf|woff|woff2)$/,
				use: 'file-loader',
			},
			{
				test: /\.svg$/,
				use: [
					{
						loader: 'svg-url-loader',
						options: {
							// Inline files smaller than 10 kB
							limit: 10 * 1024,
							noquotes: true,
						},
					},
				],
			},
			{
				test: /\.(jpg|png|gif)$/,
				use: [
					{
						loader: 'url-loader',
						options: {
							// Inline files smaller than 10 kB
							limit: 10 * 1024,
						},
					},
					{
						loader: 'image-webpack-loader',
						options: {
							mozjpeg: {
								enabled: false,
								// NOTE: mozjpeg is disabled as it causes errors in some Linux environments
								// Try enabling it in your environment by switching the config to:
								// enabled: true,
								// progressive: true,
							},
							gifsicle: {
								interlaced: false,
							},
							optipng: {
								optimizationLevel: 7,
							},
							pngquant: {
								quality: '65-90',
								speed: 4,
							},
						},
					},
				],
			},
			{
				test: /\.html$/,
				use: 'html-loader',
			},
			{
				test: /\.(mp4|webm)$/,
				use: {
					loader: 'url-loader',
					options: {
						limit: 10000,
					},
				},
			},
			{
				test: /\.scss$/,
				include: /scss/,
				loaders: ['style-loader', 'css-loader', 'sass-loader'],
			},
		],
	},
	plugins: options.plugins.concat([
		// Always expose NODE_ENV to webpack, in order to use `process.env.NODE_ENV`
		// inside your code for any environment checks; Terser will automatically
		// drop any unreachable code.
		new webpack.EnvironmentPlugin({
			NODE_ENV: 'development',
			API_URL: 'http://api.leotraining.test',
		}),
	]),
	resolve: {
		modules: ['node_modules', 'app'],
		extensions: ['.js', '.jsx', '.react.js'],
		mainFields: ['browser', 'jsnext:main', 'main'],
	},
	devtool: options.devtool,
	target: 'web', // Make web variables accessible to webpack, e.g. window
	performance: options.performance || {},
});
