/*******************************************************************************
 * 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.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()); //$NON-NLS-1$
      ((WSDLElementImpl)definition).updateElement(false);
    }
  }
  
  private QName createDefaultTypeName()
  {
    QName qname = new QName(WSDLConstants.SCHEMA_FOR_SCHEMA_URI_2001,"string"); //$NON-NLS-1$
    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;
  }
}
