/**
 ********************************************************************************
 * Copyright (c) 2018-2019 Robert Bosch GmbH.
 * 
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 * 
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 *     Robert Bosch GmbH - initial API and implementation
 ********************************************************************************
 */

package org.eclipse.app4mc.transformation.application.base;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.stream.Collectors;

import org.apache.log4j.Logger;
import org.eclipse.app4mc.transformation.extensions.AbstractTransformationInjectorModule;
import org.eclipse.app4mc.transformation.extensions.executiontype.IModelToModelConfig;
import org.eclipse.app4mc.transformation.extensions.executiontype.IModelToTextConfig;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;

public class ExtensionExecution {

	protected static Map<String, TransformationConfig> getEnabledTransformationConfigElementsFromExtensions(
			Logger logger) throws CoreException {

		final IExtensionRegistry registry = Platform.getExtensionRegistry();

		final IExtensionPoint extensionPoint = registry
				.getExtensionPoint("org.eclipse.app4mc.transformation.configuration");

		final IConfigurationElement[] extensions = extensionPoint.getConfigurationElements();

		Map<String, TransformationConfig> id_obj_Map = new LinkedHashMap<String, TransformationConfig>();

		for (final IConfigurationElement iConfigurationElement : extensions) {

			final String id = iConfigurationElement.getAttribute("id");

			final String isEnabled = iConfigurationElement.getAttribute("enabled");

			logger.info("Tansformation configuration : \"" + id + "\" isEnabled : " + isEnabled);

			if (Boolean.parseBoolean(isEnabled)) {

				TransformationConfig config = new TransformationConfig();

				final Object module = iConfigurationElement.createExecutableExtension("module_class");

				Object m2m = null;

				if (iConfigurationElement.getAttribute("m2m_class") != null) {
					m2m = iConfigurationElement.createExecutableExtension("m2m_class");
				}

				Object m2t = null;

				if (iConfigurationElement.getAttribute("m2t_class") != null) {
					m2t = iConfigurationElement.createExecutableExtension("m2t_class");
				}

				config.setId(id);

				config.setInjectorModule((AbstractTransformationInjectorModule) module);

				config.setModel2ModelConfig((IModelToModelConfig) m2m);

//				((IModelToModelConfig) m2m).setLogger(logger);

				config.setModel2TextConfig((IModelToTextConfig) m2t);

//				((IModelToTextConfig) m2m).setLogger(logger);

				id_obj_Map.put(id, config);

			}

		}

		return id_obj_Map;

	}

	@Deprecated
	protected static IModelToTextConfig getM2TFromExtension(Logger logger) throws CoreException {

		final IExtensionRegistry registry = Platform.getExtensionRegistry();

		final IExtensionPoint extensionPoint = registry
				.getExtensionPoint("org.eclipse.app4mc.transformation.extensions.m2t");

		final IConfigurationElement[] extensions = extensionPoint.getConfigurationElements();

		Map<String, IModelToTextConfig> id_obj_Map = new LinkedHashMap<String, IModelToTextConfig>();

		for (final IConfigurationElement iConfigurationElement : extensions) {

			final String id = iConfigurationElement.getAttribute("id");

			final String isEnabled = iConfigurationElement.getAttribute("enabled");

			if (Boolean.parseBoolean(isEnabled)) {

				final Object module = iConfigurationElement.createExecutableExtension("class");

				id_obj_Map.put(id, (IModelToTextConfig) module);

			}

		}

		if (id_obj_Map.size() > 1) {

			String enabledIds = "--- " + id_obj_Map.keySet().stream().filter(s -> (s != null && !s.isEmpty()))
					.collect(Collectors.joining("," + System.getProperty("line.separator") + "--- "));

			logger.error(
					"Multiple M2T configurations are enabled. Based on the standard - only one configuration for M2T transofrmation -  should be enabled for a specific product"
							+ System.getProperty("line.separator")
							+ "Below are the M2T configuration ids which are enabled : "
							+ System.getProperty("line.separator") + enabledIds);

			String firstM2T_Id = id_obj_Map.keySet().iterator().next();

			logger.warn("** M2T configuration id : \"" + firstM2T_Id + "\" is enabled");

			return id_obj_Map.get(firstM2T_Id);

		} else if (id_obj_Map.size() == 1) {

			String id = id_obj_Map.keySet().iterator().next();

			logger.info("** M2T Configuration id : \"" + id + "\" is enabled");

			return id_obj_Map.get(id);
		}

		/*- default case */
		return null;

	}

	@Deprecated
	protected static IModelToModelConfig getM2MExtension(Logger logger) throws CoreException {

		final IExtensionRegistry registry = Platform.getExtensionRegistry();

		final IExtensionPoint extensionPoint = registry
				.getExtensionPoint("org.eclipse.app4mc.transformation.extensions.m2m");

		final IConfigurationElement[] extensions = extensionPoint.getConfigurationElements();

		Map<String, IModelToModelConfig> id_Obj_Map = new LinkedHashMap<String, IModelToModelConfig>();

		for (final IConfigurationElement iConfigurationElement : extensions) {

			final String id = iConfigurationElement.getAttribute("id");

			final String isEnabled = iConfigurationElement.getAttribute("enabled");

			if (Boolean.parseBoolean(isEnabled)) {

				final Object module = iConfigurationElement.createExecutableExtension("class");

				id_Obj_Map.put(id, (IModelToModelConfig) module);

			}

		}

		if (id_Obj_Map.size() > 1) {

			String enabledIds = "--- " + id_Obj_Map.keySet().stream().filter(s -> (s != null && !s.isEmpty()))
					.collect(Collectors.joining("," + System.getProperty("line.separator") + "--- "));

			logger.error(
					"Multiple M2M configurations are enabled. Based on the standard only one M2M configurations should be enabled for a specific product"
							+ System.getProperty("line.separator") + "Below are the M2M module ids which are enabled : "
							+ System.getProperty("line.separator") + enabledIds);

			String firstM2M_moduleId = id_Obj_Map.keySet().iterator().next();

			logger.warn("** M2M configuration id : \"" + firstM2M_moduleId + "\" is enabled");

			return id_Obj_Map.get(firstM2M_moduleId);

		} else if (id_Obj_Map.size() == 1) {

			String id = id_Obj_Map.keySet().iterator().next();

			logger.info("** M2M configuration id : \"" + id + "\" is enabled");

			return id_Obj_Map.get(id);
		}

		/*- default case */
		return null;

	}

	@Deprecated
	protected static AbstractTransformationInjectorModule getInjectionModuleFromExtension(Logger logger)
			throws CoreException {

		final IExtensionRegistry registry = Platform.getExtensionRegistry();

		final IExtensionPoint extensionPoint = registry
				.getExtensionPoint("org.eclipse.app4mc.transformation.extensions.module");

		final IConfigurationElement[] extensions = extensionPoint.getConfigurationElements();

		Map<String, AbstractTransformationInjectorModule> id_Module_Map = new LinkedHashMap<String, AbstractTransformationInjectorModule>();

		for (final IConfigurationElement iConfigurationElement : extensions) {

			final String id = iConfigurationElement.getAttribute("id");

			final String isEnabled = iConfigurationElement.getAttribute("enabled");

			if (Boolean.parseBoolean(isEnabled)) {

				final Object module = iConfigurationElement.createExecutableExtension("class");

				id_Module_Map.put(id, (AbstractTransformationInjectorModule) module);

			}

		}

		if (id_Module_Map.size() > 1) {

			String enabledIds = "--- " + id_Module_Map.keySet().stream().filter(s -> (s != null && !s.isEmpty()))
					.collect(Collectors.joining("," + System.getProperty("line.separator") + "--- "));

			logger.error(
					"Multiple transformation injector modules are enabled. Based on the standard configuration for M2M transofrmation - only one module should be enabled for a specific product"
							+ System.getProperty("line.separator") + "Below are the M2M module ids which are enabled : "
							+ System.getProperty("line.separator") + enabledIds);

			String firstM2M_moduleId = id_Module_Map.keySet().iterator().next();

			logger.warn("** M2M injector module of id : \"" + firstM2M_moduleId + "\" is enabled");

			return id_Module_Map.get(firstM2M_moduleId);

		} else if (id_Module_Map.size() == 1) {

			String id = id_Module_Map.keySet().iterator().next();

			logger.info("** M2M injector module of id : \"" + id + "\" is enabled");

			return id_Module_Map.get(id);

		} else {
			logger.info("** Default M2M injector module is enabled");
		}

		/*- default case */
		return null;

	}
}
