//------------------------------------------------------------------------------
// Copyright (c) 2005, 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library.edit.process.command;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.util.AbstractTreeIterator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.command.RemoveCommand;
import org.eclipse.epf.library.edit.command.DeleteMethodElementCommand;
import org.eclipse.epf.uma.Activity;
import org.eclipse.epf.uma.Artifact;
import org.eclipse.epf.uma.UmaPackage;
import org.eclipse.epf.uma.WorkProduct;
import org.eclipse.epf.uma.WorkProductDescriptor;
import org.eclipse.epf.uma.util.ContentDescriptionFactory;
import org.eclipse.epf.uma.util.UmaUtil;


/**
 * @author Phong Nguyen Le - Jan 26, 2006
 * @since  1.0
 */
public class ProcessElementDeleteCommand extends
		DeleteMethodElementCommand {
	private Set contentsToRemove;

	private ArrayList elementsToRemoveReferences;

	private boolean ownedElementsIncluded;

	/**
	 * @param command
	 * @param elements
	 */
	public ProcessElementDeleteCommand(Command command, Collection elements) {
		super(command, elements);
	}
	
	/**
	 * @param command
	 * @param elements
	 * @param confirmRemoveRefs
	 */
	public ProcessElementDeleteCommand(Command command, Collection elements, boolean confirmRemoveRefs) {
		super(command, elements, confirmRemoveRefs);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.epf.library.edit.command.DeleteMethodElementCommand#execute()
	 */
	public void execute() {
		if(!ownedElementsIncluded) {
			Collection ownedElements = getOwnedElements(elements);
			if(!ownedElements.isEmpty()) {
				includeElements(ownedElements);
			}
			ownedElementsIncluded = true;
		}
		
		super.execute();
	}
	
	protected Collection getOwnedElements(Collection elements) {
		ArrayList ownedElements = new ArrayList();
		for (Iterator iter = elements.iterator(); iter.hasNext();) {
			Object element = (Object) iter.next();
			if(element instanceof WorkProductDescriptor) {
				WorkProductDescriptor wpd = ((WorkProductDescriptor)element);
				WorkProduct wp = wpd.getWorkProduct();
				if(wp instanceof Artifact) {
					Iterator iter1 = new AbstractTreeIterator(wp, false) {

						/**
						 * Comment for <code>serialVersionUID</code>
						 */
						private static final long serialVersionUID = 422181782268878289L;

						protected Iterator getChildren(Object object) {
							return ((Artifact)object).getContainedArtifacts().iterator();
						}
						
					};
					HashSet workProducts = new HashSet();
					while(iter1.hasNext()) {
						workProducts.add(iter1.next());
					}
					Activity activity = UmaUtil.getParentActivity(wpd);
					for (Iterator iterator = activity.getBreakdownElements().iterator(); iterator.hasNext();) {
						Object be = iterator.next();
						if (be instanceof WorkProductDescriptor
								&& workProducts.contains(((WorkProductDescriptor) be)
										.getWorkProduct())) {
							ownedElements.add(be);
						}
					}
					
				}
			}
		}
		return ownedElements;
	}

	protected void excludeElements(Collection excludedElements) {
		elements.removeAll(excludedElements);
		for (Iterator iter = excludedElements.iterator(); iter.hasNext();) {
			Object element = (Object) iter.next();
			RemoveCommand cmd = getRemoveCommand(element);
			if(cmd != null) {
				cmd.getCollection().remove(element);
			}
		}
	}
	
	protected void includeElements(Collection includedElements) {
		for (Iterator iter = includedElements.iterator(); iter.hasNext();) {
			Object element = iter.next();
			if(!elements.contains(element)) {
				elements.add(element);
				RemoveCommand cmd = getRemoveCommand(element);
				if(cmd != null) {
					Collection collection = cmd.getCollection();
					if(!collection.contains(element)) {
						collection.add(element);
					}
				}
			}
		}
	}

	public Collection getElementsToRemoveReferences() {
		if (elementsToRemoveReferences == null) {
			elementsToRemoveReferences = new ArrayList();
			for (Iterator iter = elements.iterator(); iter.hasNext();) {
				Object element = iter.next();
				if (element instanceof Activity) {
					EObject pkg = ((Activity) element).eContainer();
					if (pkg != null) {
						elementsToRemoveReferences.add(pkg);
					} else {
						elementsToRemoveReferences.add(element);
					}
				} else {
					elementsToRemoveReferences.add(element);
				}
			}
		}
		return elementsToRemoveReferences;
	}

	protected boolean canRemoveReferences(org.eclipse.epf.uma.MethodElement e) {
		return true;
	}

	protected void removeReferences() {
		contentsToRemove = new HashSet();
		// have to remove the deleted process elements from its container
		// and/or resource
		// so super.removeReferences() can remove their references
		//
		for (Iterator iter = elements.iterator(); iter.hasNext();) {
			Object obj = iter.next();
			if (obj instanceof EObject) {
				EObject eObj = (EObject) obj;
				if (obj instanceof Activity) {
					Activity act = (Activity) obj;

					// remove content of the activity from its resource
					//
					// removeContentFromResource(act, modifiedResources);
					if (ContentDescriptionFactory.hasPresentation(act)) {
						contentsToRemove.add(act.getPresentation());
					}

					// remove the process package of this activity
					//
					EObject container = eObj.eContainer();
					if (container != null) {
						EcoreUtil.remove(container);
						for (Iterator iterator = container.eAllContents(); iterator
								.hasNext();) {
							Object element = iterator.next();
							if (element instanceof Activity) {
								act = (Activity) element;

								// remove content of the activity from its
								// resource
								//
								// removeContentFromResource(act,
								// modifiedResources);
								if (ContentDescriptionFactory
										.hasPresentation(act)) {
									contentsToRemove.add(act
											.getPresentation());
								}
							}
						}
					}
				} else {
					EcoreUtil.remove((EObject) obj);
				}
			}
		}

		super.removeReferences();
	}
	
	/*
	 * (non-Javadoc)
	 * 
	 * @see DeleteMethodElementCommand#deleteContent()
	 */
	protected void deleteContent() throws Exception {
		for (Iterator iter = contentsToRemove.iterator(); iter.hasNext();) {
			EcoreUtil.remove((EObject) iter.next());
		}
		elementsToDeleteContent.addAll(contentsToRemove);
		super.deleteContent();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.epf.library.edit.command.DeleteMethodElementCommand#collectObjectsToRemove(java.util.Collection, org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EObject, java.util.Collection)
	 */
	protected boolean collectObjectsToRemove(Collection objectsToRemove, EObject elementToDelete, EObject referencer, Collection references) {
		boolean ret = super.collectObjectsToRemove(objectsToRemove, elementToDelete,
				referencer, references);
		for (Iterator iter = references.iterator(); iter.hasNext();) {
			EReference ref = (EReference) iter.next();
			if(ref == UmaPackage.eINSTANCE.getUMASemanticModelBridge_Element()) {
				EObject container = referencer.eContainer();
				if(container != null && container.eContainer() != null) {
					objectsToRemove.add(container);
					ret = true;
				}
			}
		}
		return ret;
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.emf.common.command.CommandWrapper#dispose()
	 */
	public void dispose() {
		if(contentsToRemove != null) {
			contentsToRemove.clear();
		}
		if(elementsToRemoveReferences != null) {
			elementsToRemoveReferences.clear();
		}
		
		super.dispose();
	}
}
