/*******************************************************************************
 * Copyright (c) 2001, 2006 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.wsdl.ui.internal.adapters.commands;

import javax.wsdl.OperationType;

import org.eclipse.gef.commands.Command;
import org.eclipse.wst.wsdl.Operation;
import org.eclipse.wst.wsdl.ui.internal.adapters.basic.W11Operation;
import org.eclipse.wst.wsdl.ui.internal.asd.facade.IMessageReference;

public class W11ReorderMessageReferencesCommand extends Command {
	protected IMessageReference leftSibling;
	protected IMessageReference rightSibling;
	protected IMessageReference movingParameter;
	
	public W11ReorderMessageReferencesCommand(IMessageReference leftSibling, IMessageReference rightSibling, IMessageReference movingParameter) {
		this.leftSibling = leftSibling;
		this.rightSibling = rightSibling;
		this.movingParameter = movingParameter;
	}
	
	public void execute() {
		IMessageReference leftSibElement = null;
		IMessageReference movingChild = null;
		
		if (leftSibling instanceof IMessageReference) {
			leftSibElement = (IMessageReference) leftSibling; 
		}
		if (movingParameter instanceof IMessageReference) {
			movingChild = (IMessageReference) movingParameter;
		}
		
		if (movingChild.getKind() == IMessageReference.KIND_INPUT) {
			W11Operation w11Operation = (W11Operation) movingChild.getOwnerOperation();
			Operation operation = (Operation) w11Operation.getTarget();
			
			if (leftSibElement == null) {
				// Input/Output style
				setInputOutputOrder(operation, true);
			}
			else if (leftSibElement != null && leftSibElement.getKind() == IMessageReference.KIND_INPUT) {
				if (rightSibling.getKind() == IMessageReference.KIND_OUTPUT) {
					// Input/Output style
					setInputOutputOrder(operation, true);
				}
			}
			else {
				// Output/Input style
				setInputOutputOrder(operation, false);
			}
		}
		else if (movingChild.getKind() == IMessageReference.KIND_OUTPUT) {
			W11Operation w11Operation = (W11Operation) movingChild.getOwnerOperation();
			Operation operation = (Operation) w11Operation.getTarget();
			
			if (leftSibElement == null) {
				// Output/Input style
				setInputOutputOrder(operation, false);
			}
			else if (leftSibElement != null && leftSibElement.getKind() == IMessageReference.KIND_OUTPUT) {
				if (rightSibling.getKind() == IMessageReference.KIND_INPUT) {
					// Output/Input style
					setInputOutputOrder(operation, false);
				}
			}
			else {
				// Input/Output style
				setInputOutputOrder(operation, true);
			}
		}
	}
	
	// boolean inputFirst = true if the Input is the first in the order of Input and Output
	private void setInputOutputOrder(Operation operation, boolean inputFirst) {
		// We need to determine more info before we can set the style	
		if (inputFirst && operation.getEInput() != null) {
			// Check if there is an Output
			if (operation.getEOutput() != null) {
				// Order is: Input, Output
				setOperationStyle(operation, OperationType.REQUEST_RESPONSE);
			}
			else {
				// Order is: Input
				setOperationStyle(operation, OperationType.ONE_WAY);
			}
		}
		else if (operation.getEOutput() != null) {
			// Check if there is an Input
			if (operation.getEInput() != null) {
				// Order is: Output, Input
				setOperationStyle(operation, OperationType.SOLICIT_RESPONSE);
			}
			else {
				// Order is: Output
				setOperationStyle(operation, OperationType.NOTIFICATION);
			}
		}
	}
	
	private void setOperationStyle(Operation operation, OperationType operationType) {
		// If there is no style to begin with, don't set one now
		if (operation.getStyle() == null) {
			return;
		}
		
		operation.setStyle(operationType);
	}
}