//@ts-check
/** @typedef {import('webpack').Configuration} WebpackConfig **/

const path = require('path');
const CopyPlugin = require('copy-webpack-plugin');
const ImageMinimizerPlugin = require('image-minimizer-webpack-plugin');

module.exports =
	/**
	 * @param {{ useOptimization?: boolean; squoosh?: boolean } | undefined } env
	 * @param {{ mode: 'production' | 'development' | 'none' | undefined }} argv
	 * @returns { WebpackConfig }
	 */
	function (env, argv) {
		const mode = argv.mode || 'none';
		const basePath = path.join(__dirname, 'src', 'webviews', 'apps');

		env = {
			useOptimization: true,
			squoosh: true,
			...env,
		};

		/** @type ImageMinimizerPlugin.Generator<any> */
		// @ts-ignore
		let imageGeneratorConfig = env.squoosh
			? {
					type: 'asset',
					implementation: ImageMinimizerPlugin.squooshGenerate,
					options: {
						encodeOptions: {
							webp: {
								// quality: 90,
								lossless: 1,
							},
						},
					},
			  }
			: {
					type: 'asset',
					implementation: ImageMinimizerPlugin.imageminGenerate,
					options: {
						plugins: [
							[
								'imagemin-webp',
								{
									lossless: true,
									nearLossless: 0,
									quality: 100,
									method: mode === 'production' ? 4 : 0,
								},
							],
						],
					},
			  };

		/** @type WebpackConfig['plugins'] */
		const plugins = [
			new CopyPlugin({
				patterns: [
					{
						from: path.posix.join(basePath.replace(/\\/g, '/'), 'media', '*.png'),
						to: path.posix.join(__dirname.replace(/\\/g, '/'), 'dist', 'webviews'),
					},
				],
			}),
		];

		if (!env.useOptimization) {
			plugins.push(
				new ImageMinimizerPlugin({
					deleteOriginalAssets: true,
					generator: [imageGeneratorConfig],
				}),
			);
		}

		/** @type WebpackConfig */
		const config = {
			name: 'images',
			context: basePath,
			entry: {},
			mode: mode,
			plugins: plugins,
		};

		if (env.useOptimization) {
			config.optimization = {
				minimize: true,
				minimizer: [
					new ImageMinimizerPlugin({
						deleteOriginalAssets: true,
						generator: [imageGeneratorConfig],
					}),
				],
			};
		}

		return config;
	};