import { defineAsyncComponent } from "vue";

const mapModalState = (namespace, map) => {
	const modalState = {};
	Object.entries(map).forEach(([mapKey, mapValue]) => {
		modalState[mapKey] = function func() {
			return mapValue(
				namespace
					.replace(
						"MODAL_MODULE_PATH",
						namespace.indexOf("MODAL_MODULE_PATH") !== -1
							? this.modalModulePath
							: null
					)
					.replace("MODAL_UUID", this.modalUuid)
					.split("/")
					.reduce((a, b) => a[b], this.$store.state)
			);
		};
	});
	return modalState;
};

const mapModalActions = (namespace, map) => {
	const modalState = {};
	map.forEach(mapValue => {
		modalState[mapValue] = function func(value) {
			return this.$store.dispatch(
				`${namespace
					.replace(
						"MODAL_MODULE_PATH",
						namespace.indexOf("MODAL_MODULE_PATH") !== -1
							? this.modalModulePath
							: null
					)
					.replace("MODAL_UUID", this.modalUuid)}/${mapValue}`,
				value
			);
		};
	});
	return modalState;
};

const mapModalComponents = (baseDirectory, map) => {
	const modalComponents = {};
	Object.entries(map).forEach(([mapKey, mapValue]) => {
		modalComponents[mapKey] = () =>
			defineAsyncComponent(() => import(`${baseDirectory}/${mapValue}`));
	});
	return modalComponents;
};

export { mapModalState, mapModalActions, mapModalComponents };
