/*******************************************************************************
 * Copyright (c) 2001, 2004 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.commands;

import java.util.Iterator;
import java.util.List;

import javax.xml.namespace.QName;

import org.eclipse.wst.wsdl.Definition;
import org.eclipse.wst.wsdl.Message;
import org.eclipse.wst.wsdl.Part;
import org.eclipse.wst.wsdl.WSDLElement;
import org.eclipse.wst.wsdl.WSDLFactory;
import org.eclipse.wst.wsdl.XSDSchemaExtensibilityElement;
import org.eclipse.wst.wsdl.internal.impl.PartImpl;
import org.eclipse.wst.wsdl.internal.impl.WSDLElementImpl;
import org.eclipse.wst.wsdl.util.WSDLConstants;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
import org.eclipse.xsd.XSDElementDeclaration;
import org.eclipse.xsd.XSDSchema;


public final class AddPartCommand extends WSDLElementCommand
{
  private Message message;
  private String name;
  private Part part;
  private Part originalPart;
  
  private QName typeOrElementName;
  private boolean useType = true;

  public AddPartCommand
		(Message message,
		 String name)
	{
	  this.message = message;
	  this.name = name;
	}
  
  public AddPartCommand
		(Message message,
		 String name,
		 String namespace,
		 String localName,
		 boolean useType)
	{
	  this.message = message;
	  this.name = name;
	  this.useType = useType;
	  typeOrElementName = new QName(namespace,localName);
	}
  
  /*
   * Constructor used to create a Part based on the given Part.  In essence, this will
   * create a copy of the given Part.
   */
  public AddPartCommand
	(Message message,
	 Part originalPart,
	 String name)
  {
  	this.message = message;
  	this.name = name;
  	this.originalPart = originalPart;
  }
  
  /**
   * @deprecated
   */
  public AddPartCommand
		(Message message,
		 String name,
		 String namespace,
		 String localName)
	{
	  this.message = message;
	  this.name = name;
	  typeOrElementName = new QName(namespace,localName);
	}
  
  public void setName(String name)
  {
    this.name = name;
  }
  
  public WSDLElement getWSDLElement()
  {
    return part;
  }
  
  public void run()
  {
    if (typeOrElementName == null)
      typeOrElementName = createDefaultTypeName();
    
    // Add namespace to the Definitions if it is not there yet.
    addNamespaceDeclaration();
    
    part = WSDLFactory.eINSTANCE.createPart();
    part.setName(name);
    
    if (originalPart == null) {
    	if (useType)
    		part.setTypeName(typeOrElementName);
    	else
    		part.setElementName(typeOrElementName);
    }
    else {
    	if (originalPart.getTypeName() != null)
    		part.setTypeName(originalPart.getTypeName());

    	String newElementName = null;
    	if (originalPart.getElementName() != null) {
    		
    		boolean createNewElement = true;
    		if (originalPart.getElementDeclaration() != null && originalPart.getElementDeclaration().getElement() != null) {
        		if (!(originalPart.getElementDeclaration().getElement() instanceof IDOMNode)) {
        			createNewElement = false;
        		}        		
    		}
    		
    		if (createNewElement) {
    			newElementName = getNewNameHelper(name, originalPart.getEnclosingDefinition(), false);
    			part.setElementName(new QName(originalPart.getElementName().getNamespaceURI(), newElementName));
	
    			if (originalPart.getEnclosingDefinition() != null) {
    				if (newElementName == null) {
    					newElementName = getNewNameHelper(name, originalPart.getEnclosingDefinition(), false);
    				}
    		
    				AddXSDElementDeclarationCommand elementAction = new AddXSDElementDeclarationCommand(originalPart.getEnclosingDefinition(), newElementName);
    				elementAction.run();
    			}
    		}
    		else {
    			part.setElementName(new QName(originalPart.getElementName().getNamespaceURI(), originalPart.getElementName().getLocalPart()));
    		}
    	}
    }
    	
    part.setEnclosingDefinition(message.getEnclosingDefinition());
    ((PartImpl)part).reconcileReferences(false); 
    message.addPart(part);
  }
  
  private void addNamespaceDeclaration()
  {
    Definition definition = message.getEnclosingDefinition();
    if (!definition.getNamespaces().containsValue(typeOrElementName.getNamespaceURI()))
    {
      definition.addNamespace("p",typeOrElementName.getNamespaceURI());
      ((WSDLElementImpl)definition).updateElement(false);
    }
  }
  
  private QName createDefaultTypeName()
  {
    QName qname = new QName(WSDLConstants.SCHEMA_FOR_SCHEMA_URI_2001,"string");
    return qname;
  }
  
  private String getNewNameHelper(String base, Definition def, boolean isType)
  { 
    String name = base;    
    int count = 0;

    // Ugly....  Redo this...
    // Get a list of Elements...
    List elementList = null;
    if (def.getETypes() != null) {
    	List xsdsList = def.getETypes().getEExtensibilityElements();
    	if (xsdsList != null) {
    		Iterator xsdsIterator = xsdsList.iterator();
    		XSDSchemaExtensibilityElement xsdElement = (XSDSchemaExtensibilityElement) xsdsIterator.next();
    		XSDSchema schema = xsdElement.getSchema();
    		if (schema != null) {
    			elementList = schema.getElementDeclarations();
    		}
    	}
    }
    
    if (elementList != null) {
    	int index = 0;
    	while (index < elementList.size()) {
    		XSDElementDeclaration elementDeclaration = (XSDElementDeclaration) elementList.get(index);
    		
    		if (name.equals(elementDeclaration.getName())) {
    			count++;
    			name = name + count;
    			index = 0;
    		}
    		else {
    			index++;
    		}
    	}
    }

    return name;
  }
}
