"use strict";

/** @typedef {import("../../../../").WebpackPluginInstance} WebpackPluginInstance */

const { DefinePlugin } = require("../../../../");
const currentWatchStep = require("../../../helpers/currentWatchStep");

/** @type {import("../../../../").Configuration} */
module.exports = {
	cache: {
		type: "memory",
		cacheUnaffected: false
	},
	plugins: [
		(compiler) => {
			const base = {
				DEFINE: "{}",
				RUN: DefinePlugin.runtimeValue(
					() => Number(currentWatchStep.step || 0),
					[]
				)
			};
			const defines = [
				{
					...base,
					"DEFINE.A": 0,
					"DEFINE.B": 2
				},
				{
					// change
					...base,
					"DEFINE.A": 1,
					"DEFINE.B": 2
				},
				{
					// add
					...base,
					"DEFINE.A": 1,
					"DEFINE.B": 2,
					"DEFINE.C": 3
				},
				{
					// remove
					...base,
					"DEFINE.A": 1,
					"DEFINE.C": 3
				}
			];
			compiler.hooks.compilation.tap("webpack.config", (...args) => {
				const plugin = new DefinePlugin(
					defines[Number(currentWatchStep.step || 0)]
				);
				plugin.apply(
					/** @type {EXPECTED_ANY} */
					({
						hooks: {
							compilation: {
								/**
								 * @param {string} name name
								 * @param {EXPECTED_FUNCTION} fn fn
								 */
								tap: (name, fn) => {
									fn(...args);
								}
							}
						}
					})
				);
			});
		}
	]
};
