/*******************************************************************************
 * Copyright (c) 2005, 2012 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.bpel.ui.details.tree;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.eclipse.bpel.model.messageproperties.Property;
import org.eclipse.bpel.model.messageproperties.PropertyAlias;
import org.eclipse.bpel.ui.util.BPELUtil;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.wst.wsdl.Input;
import org.eclipse.wst.wsdl.Message;
import org.eclipse.wst.wsdl.Output;
import org.eclipse.wst.wsdl.Part;

/**
 * Tree node to represent a message-type model object.
 */
public class MessageTypeTreeNode extends TreeNode {

	boolean isPropertyTree;
	boolean displayParticles;
	
	public MessageTypeTreeNode(Input msg, boolean isCondensed, boolean isProperty) {
		this(msg, isCondensed, isProperty,true);		
	}
	
	
	public MessageTypeTreeNode(Output msg, boolean isCondensed, boolean isProperty) {
		this(msg, isCondensed, isProperty,true);		
	}
	
	public MessageTypeTreeNode(Message messageType, boolean isCondensed, boolean isPropertyTree) {
		this(messageType, isCondensed, isPropertyTree, true);
	}
	
	
	public MessageTypeTreeNode (Message messageType, boolean isCondensed,
		boolean isPropertyTree, boolean displayParticles) {
		this((EObject) messageType,isCondensed,isPropertyTree,displayParticles);
	}
	
	
	private MessageTypeTreeNode(EObject obj,  boolean isCondensed,
			boolean isPropertyTree, boolean displayParticles ) 
	{
		super(obj, isCondensed);
		this.isPropertyTree = isPropertyTree;
		this.displayParticles = displayParticles;
	}

	/* ITreeNode */

	@Override
	public Object[] getChildren() {
		
		Message msg = getMessage();
		
		if (msg == null) {
			return EMPTY_ARRAY;
		}
		
		if (isPropertyTree) {
			// Find propertyAliases that refer to this message.
			List<PropertyAlias> aliases = BPELUtil.getPropertyAliasesForMessageType(msg);
			List<Property> properties = getPropertiesFromPropertyAliases(aliases);
			List<PropertyTreeNode> list = new ArrayList<PropertyTreeNode>();
			for (Iterator<Property> it = properties.iterator(); it.hasNext(); ) {
				list.add(new PropertyTreeNode(it.next(), isCondensed));
			}
			return list.toArray();
		}

		if (msg.getParts() == null) {
			return EMPTY_ARRAY;
		}
		
		List<PartTreeNode> list = new ArrayList<PartTreeNode>();
		for (Iterator<Part> it = msg.getParts().values().iterator(); it.hasNext(); ) {
			list.add(new PartTreeNode(it.next(), isCondensed, displayParticles));
		}
		return list.toArray();
	}

	@Override
	public boolean hasChildren() {
		if (isPropertyTree) {
			// TODO: we need some sort of property map maintained by the same
			// builder that will keep track of the namespaceURI's of WSDL files
			return getChildren().length > 0;
		}

		Message msg = getMessage();
		if (msg == null) {
			return false;
		}
		
		return (msg.getParts() != null && !msg.getParts().isEmpty());
	}

	/* other methods */
	
	protected List<Property> getPropertiesFromPropertyAliases(List<PropertyAlias> aliases) {
		List<Property> properties = new ArrayList<Property>();
		Set<Property> propertySet = new HashSet<Property>();
		for (Iterator<PropertyAlias> it = aliases.iterator(); it.hasNext(); ) {
			PropertyAlias alias = it.next();
			Property property = (Property)alias.getPropertyName();
			if (!propertySet.contains(property)) {
				properties.add(property);
				propertySet.add(property);
			}
		}
		return properties;
	}
	
	
	Message getMessage () {
		if (modelObject instanceof Message) {
			return (Message) modelObject;
		}
		if (modelObject instanceof Input) {
			return ((Input)modelObject).getEMessage();
		}
		if (modelObject instanceof Output) {
			return ((Output)modelObject).getEMessage();
		}
		return null;
	}
	
	
}
