/*********************************************************************
* Copyright (c) 2005, 2019 SAP SE
*
* 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/
*
* Contributors:
*    mwenz - Bug 324859 - initial API, implementation and documentation
*    mwenz - Bug 389380 - Undo/Redo handling wrong Command executed by undo action
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipse.graphiti.ui.internal.services.impl;

import java.util.List;

import org.eclipse.emf.common.command.Command;
import org.eclipse.gef.commands.CompoundCommand;
import org.eclipse.graphiti.IExecutionInfo;
import org.eclipse.graphiti.features.IContextHolder;
import org.eclipse.graphiti.features.IFeature;
import org.eclipse.graphiti.features.IFeatureAndContext;
import org.eclipse.graphiti.features.IFeatureHolder;
import org.eclipse.graphiti.features.context.IContext;
import org.eclipse.graphiti.internal.DefaultFeatureAndContext;
import org.eclipse.graphiti.internal.command.CommandContainer;
import org.eclipse.graphiti.internal.command.DefaultExecutionInfo;
import org.eclipse.graphiti.internal.command.GFPreparableCommand2;
import org.eclipse.graphiti.internal.command.ICommand;
import org.eclipse.graphiti.tb.IContextEntry;
import org.eclipse.graphiti.ui.internal.command.AddModelObjectCommand;
import org.eclipse.graphiti.ui.internal.command.ContextEntryCommand;
import org.eclipse.graphiti.ui.internal.command.CreateConnectionCommand;
import org.eclipse.graphiti.ui.internal.command.GFCommand;
import org.eclipse.graphiti.ui.internal.command.GefCommandWrapper;
import org.eclipse.graphiti.ui.internal.command.ReconnectCommand;
import org.eclipse.graphiti.ui.internal.editor.EmfOnGefCommand;
import org.eclipse.graphiti.ui.internal.editor.GefOnEmfCommand;
import org.eclipse.graphiti.ui.internal.services.ICommandService;

/**
 * @noinstantiate This class is not intended to be instantiated by clients.
 * @noextend This class is not intended to be subclassed by clients.
 */
public class CommandService implements ICommandService {

	public org.eclipse.emf.common.command.Command transformFromGefToEmfCommand(org.eclipse.gef.commands.Command gefCommand) {
		if (gefCommand instanceof GefOnEmfCommand) {
			GefOnEmfCommand gefOnEmfCommand = (GefOnEmfCommand) gefCommand;
			return gefOnEmfCommand.getEmfCommand();
		}
		return new EmfOnGefCommand(gefCommand);
	}

	public org.eclipse.gef.commands.Command transformFromEmfToGefCommand(org.eclipse.emf.common.command.Command emfCommand) {
		if (emfCommand instanceof EmfOnGefCommand) {
			EmfOnGefCommand emfOnGefCommand = (EmfOnGefCommand) emfCommand;
			return emfOnGefCommand.getGefCommand();
		} else if (emfCommand instanceof GFPreparableCommand2) {
			Command command = ((GFPreparableCommand2) emfCommand).getCommand();
			return transformFromEmfToGefCommand(command);
		}
		return new GefOnEmfCommand(emfCommand);
	}

	public DefaultExecutionInfo completeExecutionInfo(DefaultExecutionInfo executionInfo, org.eclipse.gef.commands.Command gefCommand) {
		if (gefCommand instanceof CompoundCommand) {
			CompoundCommand compoundCommand = (CompoundCommand) gefCommand;
			@SuppressWarnings("unchecked")
			final List<org.eclipse.gef.commands.Command> commands = compoundCommand.getCommands();
			for (org.eclipse.gef.commands.Command childCommand : commands) {
				completeExecutionInfo(executionInfo, childCommand);
			}
		}
		if (gefCommand instanceof CreateConnectionCommand) {
			CreateConnectionCommand createConnectionCommand = (CreateConnectionCommand) gefCommand;
			final IFeatureAndContext[] features = createConnectionCommand.getFeaturesAndContexts();
			for (IFeatureAndContext feature : features) {
				executionInfo.addFeatureAndContext(feature);
			}
		}
		if (gefCommand instanceof ReconnectCommand) {
			ReconnectCommand reconnectCommand = (ReconnectCommand) gefCommand;
			executionInfo.addFeatureAndContext(new DefaultFeatureAndContext(reconnectCommand.getFeature(),
					reconnectCommand.getContext()));
		}
		if (gefCommand instanceof GefCommandWrapper) {
			GefCommandWrapper gefCommandWrapper = (GefCommandWrapper) gefCommand;
			final ICommand graphitiCommand = gefCommandWrapper.getCommand();
			completeExecutionInfo(executionInfo, graphitiCommand);
		}
		if (gefCommand instanceof GFCommand) {
			final GFCommand gfCommand = (GFCommand) gefCommand;
			executionInfo.addFeatureAndContext(new DefaultFeatureAndContext(gfCommand.getFeature(), gfCommand.getContext()));
		}
		if (gefCommand instanceof ContextEntryCommand) {
			ContextEntryCommand cec = (ContextEntryCommand) gefCommand;
			IContextEntry contextEntry = cec.getContextEntry();
			executionInfo.addFeatureAndContext(new DefaultFeatureAndContext(contextEntry.getFeature(), contextEntry.getContext()));
		}
		if (gefCommand instanceof AddModelObjectCommand) {
			AddModelObjectCommand addModelObjectCommand = (AddModelObjectCommand) gefCommand;
			final IFeatureAndContext[] features = addModelObjectCommand.getFeaturesAndContexts();
			for (IFeatureAndContext feature : features) {
				executionInfo.addFeatureAndContext(feature);
			}
		}

		return executionInfo;
	}

	public DefaultExecutionInfo completeExecutionInfo(DefaultExecutionInfo executionInfo, ICommand gfCommand) {
		if (gfCommand instanceof CommandContainer) {
			CommandContainer cc = (CommandContainer) gfCommand;
			final ICommand[] childCommands = cc.getCommands();
			for (int i = 0; i < childCommands.length; i++) {
				ICommand childCommand = childCommands[i];
				completeExecutionInfo(executionInfo, childCommand);
			}
		}

		else {
			IContext context = null;
			IFeature feature = null;
			if (gfCommand instanceof IFeatureHolder) {
				IFeatureHolder featureHolder = (IFeatureHolder) gfCommand;
				feature = featureHolder.getFeature();
			}
			if (gfCommand instanceof IContextHolder) {
				IContextHolder contextHolder = (IContextHolder) gfCommand;
				context = contextHolder.getContext();
			}
			executionInfo.addFeatureAndContext(new DefaultFeatureAndContext(feature, context));
		}

		return executionInfo;
	}

	public IExecutionInfo removeFeaturesWithoutChanges(IExecutionInfo executionInfo) {
		DefaultExecutionInfo result = new DefaultExecutionInfo();
		for (IFeatureAndContext featureAndContext : executionInfo.getExecutionList()) {
			if (featureAndContext.getFeature().hasDoneChanges()) {
				result.addFeatureAndContext(featureAndContext);
			}
		}
		return result;
	}
}
