/*******************************************************************************
 * Copyright (c) 2014 Bosch Software Innovations GmbH and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and Eclipse Distribution License v1.0 which accompany this distribution.
 *
 * The Eclipse Public License is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * The Eclipse Distribution License is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 * Bosch Software Innovations GmbH - Please refer to git log
 *
 *******************************************************************************/
package org.eclipse.vorto.codegen.internal.extensioninterface;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.CompoundContributionItem;
import org.eclipse.ui.menus.CommandContributionItem;
import org.eclipse.ui.menus.CommandContributionItemParameter;
import org.eclipse.vorto.codegen.Activator;
import org.eclipse.vorto.codegen.api.ICodeGenerator;
import org.osgi.framework.Bundle;


public class PopulateGeneratorsMenu extends CompoundContributionItem {

	private static final String GENERATEALL_CLASS = "org.eclipse.vorto.codegen.extensioninterface.EvaluateContributionsHandler";
	private static final String CLASS = "class";
	private static final String MENU_LABEL = "menuLabel";
	public static final String GENERATE_ALL = "Generate All";

	public PopulateGeneratorsMenu() {
	}

	public PopulateGeneratorsMenu(String id) {
		super(id);
	}

	@Override
	protected IContributionItem[] getContributionItems() {
		List<CommandContributionItem> contributionItems = new ArrayList<CommandContributionItem>();
		IConfigurationElement[] registeredGenerators = getAllRegisteredGeneratorNames();
		for (IConfigurationElement aGenerator : registeredGenerators) {
			CommandContributionItem commandForGenerator = constructCommandForGenerator(aGenerator);
			if (commandForGenerator != null) {
				contributionItems.add(commandForGenerator);
			}
		}
		CommandContributionItem generateAllContributionItem = constructCommandForGenerator(
				GENERATEALL_CLASS, GENERATE_ALL, GENERATE_ALL,
				"org.eclipse.vorto.codegen");
		contributionItems.add(generateAllContributionItem);
		return contributionItems
				.toArray(new IContributionItem[contributionItems.size()]);
	}

	private CommandContributionItem constructCommandForGenerator(
			IConfigurationElement aGenerator) {
		return constructCommandForGenerator(populateExtensionMetaData(aGenerator));
	}

	@SuppressWarnings("unchecked")
	private CommandContributionItem constructCommandForGenerator(
			ExtensionMetaData extensionMetaData) {
		String extensionIdentifier = extensionMetaData.getExtensionIdentifier();
		if (StringUtils.isNotEmpty(extensionIdentifier)) {
			CommandContributionItemParameter generatorCommand = new CommandContributionItemParameter(
					PlatformUI.getWorkbench().getActiveWorkbenchWindow(),
					"org.eclipse.vorto.codegen.dynamic.menu.contribution.item.id",
					"org.eclipse.vorto.codegen.generator.command.id", SWT.NONE);
			CommandContributionItem generatorContributionItem;
			generatorCommand.label = extensionMetaData.getMenuLabel();
			String iconPath = extensionMetaData.getIconPath();
			Bundle bundle = Platform.getBundle(extensionMetaData
					.getGeneratorPluginId());
			if (iconPath == null) {
				// Load the defaults
				iconPath = "icons/generate.gif";
				bundle = Platform.getBundle(Activator.PLUGIN_ID);
			}
			IPath path = new Path(iconPath);
			generatorCommand.icon = ImageDescriptor.createFromURL(FileLocator
					.find(bundle, path, null));
			generatorCommand.parameters = new HashMap<String, String>();
			generatorCommand.parameters.put(
					"org.eclipse.vorto.codegen.generator.commandParameter",
					extensionIdentifier);
			generatorContributionItem = new CommandContributionItem(
					generatorCommand);
			return generatorContributionItem;
		}
		return null;
	}

	private ExtensionMetaData populateExtensionMetaData(
			IConfigurationElement confiurationElement) {
		ExtensionMetaData extensionMetaData = new ExtensionMetaData();
		extensionMetaData.setGeneratorPluginId(confiurationElement
				.getContributor().getName());
		extensionMetaData.setClassName(confiurationElement.getAttribute(CLASS));
		extensionMetaData.setExtensionIdentifier(confiurationElement
				.getDeclaringExtension().getUniqueIdentifier());
		extensionMetaData.setMenuLabel(confiurationElement
				.getAttribute(MENU_LABEL));
		extensionMetaData.setIconPath(confiurationElement.getAttribute("icon"));
		return extensionMetaData;
	}

	@SuppressWarnings("unchecked")
	private CommandContributionItem constructCommandForGenerator(
			String className, String extensionIdentifier, String menuLabel,
			String generatorPluginId) {
		CommandContributionItemParameter generatorCommand = new CommandContributionItemParameter(
				PlatformUI.getWorkbench().getActiveWorkbenchWindow(),
				"org.eclipse.vorto.codegen.dynamic.menu.contribution.item.id",
				"org.eclipse.vorto.codegen.generator.command.id", SWT.NONE);
		generatorCommand.label = menuLabel;
		Bundle bundle = Platform.getBundle("org.eclipse.vorto.codegen");
		IPath path = new Path("icons/generate.gif");
		generatorCommand.icon = ImageDescriptor.createFromURL(FileLocator.find(
				bundle, path, null));
		generatorCommand.parameters = new HashMap<String, String>();
		generatorCommand.parameters.put(
				"org.eclipse.vorto.codegen.generator.commandParameter",
				extensionIdentifier);
		CommandContributionItem generatorContributionItem = new CommandContributionItem(
				generatorCommand);
		return generatorContributionItem;
	}

	private IConfigurationElement[] getAllRegisteredGeneratorNames() {
		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
		final IConfigurationElement[] generators = extensionRegistry
				.getConfigurationElementsFor(ICodeGenerator.GENERATOR_ID);
		return generators;
	}

}
