//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 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.search.ui.internal;

import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
import org.eclipse.epf.library.edit.LibraryEditPlugin;
import org.eclipse.epf.search.ui.SearchUIResources;
import org.eclipse.epf.uma.Activity;
import org.eclipse.epf.uma.Artifact;
import org.eclipse.epf.uma.ContentElement;
import org.eclipse.epf.uma.ContentPackage;
import org.eclipse.epf.uma.Discipline;
import org.eclipse.epf.uma.Domain;
import org.eclipse.epf.uma.MethodPackage;
import org.eclipse.epf.uma.MethodPlugin;
import org.eclipse.epf.uma.Practice;
import org.eclipse.epf.uma.Process;
import org.eclipse.epf.uma.ProcessComponent;
import org.eclipse.epf.uma.ProcessElement;
import org.eclipse.epf.uma.ProcessPackage;
import org.eclipse.epf.uma.util.UmaUtil;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;

/**
 * The content provider for the method search result tree viewer.
 * 
 * @author Kelvin Low
 * @author Phong Nguyen Le
 * @since 1.0
 */
public class SearchResultTreeContentProvider implements ITreeContentProvider {

	private static final String PKG_NAME_CONTENT = "Content"; //$NON-NLS-1$

	private static final String PKG_NAME_CORE_CONTENT = "CoreContent"; //$NON-NLS-1$

	private static final String PKG_NAME_CATEGORIES = "Categories"; //$NON-NLS-1$

	private static final String PKG_NAME_DISCIPLINES = "Disciplines"; //$NON-NLS-1$

	private static final String PKG_NAME_DOMAINS = "Domains"; //$NON-NLS-1$

	private static final String PKG_NAME_WORK_PRODUCT_TYPES = "WP Types"; //$NON-NLS-1$

	private static final String PKG_NAME_ROLESETS = "RoleSets"; //$NON-NLS-1$

	private static final String PKG_NAME_TOOLS = "Tools"; //$NON-NLS-1$

	private static final String PKG_NAME_CUSTOM_CATEGORIES = "CustomCategories"; //$NON-NLS-1$

	private static final String PKG_NAME_CAPABILITY_PATTERNS = "CapabilityPatterns"; //$NON-NLS-1$

	private static final String PKG_NAME_DELIVERY_PROCESSES = "DeliveryProcesses"; //$NON-NLS-1$

	private static final String METHOD_CONTENT = SearchUIResources.searchResult_methodContent; 

	private static final String CONTENT_PACKAGES = SearchUIResources.searchResult_contentPackages; 

	private static final String STANDARD_CATEGORIES = SearchUIResources.searchResult_standardCategories; 

	private static final String DISCIPLINES = SearchUIResources.searchResult_disciplines; 

	private static final String DOMAINS = SearchUIResources.searchResult_domains; 

	private static final String WORK_PRODUCT_TYPES = SearchUIResources.searchResult_workProductTypes; 

	private static final String ROLESETS = SearchUIResources.searchResult_roleSets; 

	private static final String TOOLS = SearchUIResources.searchResult_tools; 

	private static final String CUSTOM_CATEGORIES = SearchUIResources.searchResult_customCategories; 

	private static final String PROCESSES = SearchUIResources.searchResult_processes; 

	private static final String CAPABILITY_PATTERNS = SearchUIResources.searchResult_capabilityPatterns; 

	private static final String DELIVERY_PROCESSES = SearchUIResources.searchResult_deliveryProcesses; 

	private static final Object[] EMPTY_LIST = new Object[0];

	private TreeViewer treeViewer;

	private MethodSearchResult searchResult;

	private Map<Object, Set<Object>> elementMap;

	/**
	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(Object)
	 */
	public Object[] getElements(Object inputElement) {
		if (inputElement instanceof MethodSearchResult) {
			Object[] elements = ((MethodSearchResult) inputElement)
					.getElements();
			if (elements.length == 0) {
				return EMPTY_LIST;
			}
			elementMap = new HashMap<Object, Set<Object>>();
			for (int i = 0; i < elements.length; i++) {
				insert(elements[i], false);
			}

			insertUIFolders(inputElement);
		}
		return getChildren(inputElement);
	}

	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
		if (newInput != null && newInput instanceof MethodSearchResult) {
			treeViewer = (TreeViewer) viewer;
			searchResult = (MethodSearchResult) newInput;
		}
	}

	public void elementsChanged(Object[] updatedElements) {
		for (int i = 0; i < updatedElements.length; i++) {
			if (searchResult.getMatchCount(updatedElements[i]) > 0) {
				if (treeViewer.testFindItem(updatedElements[i]) != null) {
					insert(updatedElements[i], true);
				} else {
					remove(updatedElements[i], true);
				}
			} else {
				treeViewer.remove(updatedElements[i]);
			}
		}
		treeViewer.refresh();
	}

	/**
	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(Object)
	 */
	public Object[] getChildren(Object parentElement) {
		if (elementMap == null) {
			return EMPTY_LIST;
		}
		Set<Object> children = elementMap.get(parentElement);
		if (children == null) {
			return EMPTY_LIST;
		}
		return children.toArray();
	}

	/**
	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(Object)
	 */
	public Object getParent(Object element) {
		if (element instanceof MethodPlugin) {
			return null;
		} else if (element instanceof SearchResultUIFolder) {
			return ((SearchResultUIFolder) element).getParent();
		} else if (element instanceof ProcessPackage) {
			ProcessPackage processPackage = (ProcessPackage) element;
			Object parent = processPackage.eContainer();
			if (parent instanceof ProcessComponent) {
				ProcessComponent processComponent = (ProcessComponent) parent;
				return processComponent.getProcess();
			} else {
				return parent;
			}
		} else if (element instanceof MethodPackage) {
			MethodPackage methodPackage = (MethodPackage) element;
			Object parent = methodPackage.eContainer();
			if (parent instanceof MethodPlugin) {
				return parent;
			}
			MethodPackage parentPackage = methodPackage.getParentPackage();
			return parentPackage;
		} else if (element instanceof Artifact) {
			Artifact artifact = (Artifact) element;
			Artifact containerArtifact = artifact.getContainerArtifact();
			if (containerArtifact != null) {
				return containerArtifact;
			} else {
				return UmaUtil.getContentPackage(artifact);
			}
		} else if (element instanceof Practice) {
			Practice practice = (Practice) element;
			return practice.getContainer();
		} else if (element instanceof Discipline) {
			Discipline discipline = (Discipline) element;
			return discipline.getContainer();			
		} else if (element instanceof Domain) {
			Domain domain = (Domain) element;
			return domain.getContainer();
		} else if (element instanceof ContentElement) {
			return UmaUtil.getContentPackage((ContentElement) element);
		} else if (element instanceof Process) {
			Process process = (Process) element;
			ProcessPackage parent = (ProcessPackage) process.eContainer();
			if (parent != null) {
				return parent.eContainer();
			}
		} else if (element instanceof Activity) {
			ProcessPackage processPackage = UmaUtil
					.getProcessPackage((ProcessElement) element);
			if (processPackage != null) {
				ProcessPackage parentPackage = (ProcessPackage) processPackage
						.getParentPackage();
				if (parentPackage != null) {
					if (parentPackage instanceof ProcessComponent) {
						ProcessComponent processComponent = (ProcessComponent) parentPackage;
						return processComponent.getProcess();
					}
					List<ProcessElement> processElements = parentPackage.getProcessElements();
					for (ProcessElement processElement : processElements) {
						if (processElement instanceof Activity
								&& processElement.getName().equals(
										parentPackage.getName())) {
							return processElement;
						}
					}
				}
			}
		} else if (element instanceof ProcessElement) {
			ProcessPackage processPackage = UmaUtil
					.getProcessPackage((ProcessElement) element);
			if (processPackage != null) {
				if (processPackage instanceof ProcessComponent) {
					ProcessComponent processComponent = (ProcessComponent) processPackage;
					return processComponent.getProcess();
				}
				List<ProcessElement> processElements = processPackage.getProcessElements();
				for (ProcessElement processElement : processElements) {
					if (processElement instanceof Activity
							&& processElement.getName().equals(
									processPackage.getName())) {
						return processElement;
					}
				}
				return processPackage;
			}
		}
		return null;
	}

	/**
	 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(Object)
	 */
	public boolean hasChildren(Object element) {
		return getChildren(element).length > 0;
	}

	public void clear() {
		treeViewer.refresh();
	}

	public void dispose() {
	}

	protected void insert(Object child, boolean refreshViewer) {
		Object parent = getParent(child);
		while (parent != null) {
			if (insertChild(parent, child)) {
				if (refreshViewer) {
					treeViewer.add(parent, child);
				}
			} else {
				if (refreshViewer) {
					treeViewer.refresh(parent);
				}
				return;
			}
			child = parent;
			parent = getParent(child);
		}
		if (insertChild(searchResult, child)) {
			if (refreshViewer) {
				treeViewer.add(searchResult, child);
			}
		}
	}

	protected boolean insertChild(Object parent, Object child) {
		Set<Object> children = elementMap.get(parent);
		if (children == null) {
			children = new HashSet<Object>();
			elementMap.put(parent, children);
		}
		return children.add(child);
	}

	protected void replace(Object parent, Object child, Object newChild) {
		insert(newChild, false);
		elementMap.put(newChild, elementMap.get(child));
		elementMap.remove(child);
		Set<Object> children = elementMap.get(parent);
		children.remove(child);
	}

	protected void remove(Object element, boolean refreshViewer) {
		if (hasChildren(element)) {
			if (refreshViewer) {
				treeViewer.refresh(element);
			}
		} else {
			if (searchResult.getMatchCount(element) == 0) {
				elementMap.remove(element);
				Object parent = getParent(element);
				if (parent != null) {
					removeFromSiblings(element, parent);
					remove(parent, refreshViewer);
				} else {
					removeFromSiblings(element, searchResult);
					if (refreshViewer) {
						treeViewer.refresh();
					}
				}
			} else {
				if (refreshViewer) {
					treeViewer.refresh(element);
				}
			}
		}
	}

	protected void removeFromSiblings(Object element, Object parent) {
		Set<Object> siblings = elementMap.get(parent);
		if (siblings != null) {
			siblings.remove(element);
		}
	}
	
	protected void insertUIFolders(MethodPlugin element) {
		SearchResultUIFolder methodContentFolder = new SearchResultUIFolder(
				METHOD_CONTENT, ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
						.getImage("full/obj16/Content")), element); //$NON-NLS-1$
		SearchResultUIFolder processesFolder = new SearchResultUIFolder(
				PROCESSES, ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
						.getImage("full/obj16/Processes")), element); //$NON-NLS-1$
		Object[] methodPackages = getChildren(element);
		for (int j = 0; j < methodPackages.length; j++) {
			Object methodPackage = methodPackages[j];
			if (methodPackage instanceof ContentPackage
					&& ((ContentPackage) methodPackage).getName()
							.equals(PKG_NAME_CONTENT)) {
				Object[] packages = getChildren(methodPackage);
				for (int k = 0; k < packages.length; k++) {
					Object pkg = packages[k];
					if (pkg instanceof ContentPackage) {
						if (((ContentPackage) pkg).getName().equals(
								PKG_NAME_CORE_CONTENT)) {
							replace(
									element,
									pkg,
									new SearchResultUIFolder(
											CONTENT_PACKAGES,
											ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
													.getImage("full/obj16/MethodPackages")), methodContentFolder)); //$NON-NLS-1$
						} else if (((ContentPackage) pkg).getName()
								.equals(PKG_NAME_CATEGORIES)) {
							SearchResultUIFolder standardCategoriesFolder = new SearchResultUIFolder(
									STANDARD_CATEGORIES,
									ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
											.getImage("full/obj16/StandardCategories")), methodContentFolder); //$NON-NLS-1$
							SearchResultUIFolder customCategoriesFolder = new SearchResultUIFolder(
									CUSTOM_CATEGORIES,
									ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
											.getImage("full/obj16/CustomCategories")), methodContentFolder); //$NON-NLS-1$
							Object[] contentPackages = getChildren(pkg);
							for (int l = 0; l < contentPackages.length; l++) {
								Object contentPackage = contentPackages[l];
								if (contentPackage instanceof ContentPackage) {
									String pkgName = ((ContentPackage) contentPackage)
											.getName();
									if (pkgName
											.equals(PKG_NAME_CUSTOM_CATEGORIES)) {
										insert(customCategoriesFolder,
												false);
										elementMap.put(customCategoriesFolder,
												elementMap.get(contentPackage));
									} else if (pkgName
											.equals(PKG_NAME_DISCIPLINES)) {
										insert(
												standardCategoriesFolder,
												false);
										replace(
												element,
												contentPackage,
												new SearchResultUIFolder(
														DISCIPLINES,
														ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
																.getImage("full/obj16/Disciplines")), standardCategoriesFolder)); //$NON-NLS-1$
									} else if (pkgName
											.equals(PKG_NAME_DOMAINS)) {
										insert(
												standardCategoriesFolder,
												false);
										replace(
												element,
												contentPackage,
												new SearchResultUIFolder(
														DOMAINS,
														ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
																.getImage("full/obj16/Domains")), standardCategoriesFolder)); //$NON-NLS-1$
									} else if (pkgName
											.equals(PKG_NAME_WORK_PRODUCT_TYPES)) {
										insert(
												standardCategoriesFolder,
												false);
										replace(
												element,
												contentPackage,
												new SearchResultUIFolder(
														WORK_PRODUCT_TYPES,
														ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
																.getImage("full/obj16/WorkProductTypes")), standardCategoriesFolder)); //$NON-NLS-1$
									} else if (pkgName
											.equals(PKG_NAME_ROLESETS)) {
										insert(
												standardCategoriesFolder,
												false);
										replace(
												element,
												contentPackage,
												new SearchResultUIFolder(
														ROLESETS,
														ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
																.getImage("full/obj16/Roles")), standardCategoriesFolder)); //$NON-NLS-1$
									} else if (pkgName
											.equals(PKG_NAME_TOOLS)) {
										insert(
												standardCategoriesFolder,
												false);
										replace(
												element,
												contentPackage,
												new SearchResultUIFolder(
														TOOLS,
														ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
																.getImage("full/obj16/Tools")), standardCategoriesFolder)); //$NON-NLS-1$
									}
								}
							}
							elementMap.remove(pkg);
						}
					} else if (pkg instanceof ProcessPackage
							&& ((ProcessPackage) pkg).getName().equals(
									PKG_NAME_CAPABILITY_PATTERNS)) {
						replace(
								element,
								pkg,
								new SearchResultUIFolder(
										CAPABILITY_PATTERNS,
										ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
												.getImage("full/obj16/CapabilityPatterns")), processesFolder)); //$NON-NLS-1$
					}
				}
				Set<Object> children = (Set<Object>) elementMap.get(element);
				children.remove(methodPackage);
			} else if (methodPackage instanceof ProcessPackage
					&& ((ProcessPackage) methodPackage).getName()
							.equals(PKG_NAME_DELIVERY_PROCESSES)) {
				replace(
						element,
						methodPackage,
						new SearchResultUIFolder(
								DELIVERY_PROCESSES,
								ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
										.getImage("full/obj16/DeliveryProcesses")), processesFolder)); //$NON-NLS-1$
			}
		}
	}

	/**
	 * Inserts the UI folders into the search result tree.
	 */
	protected void insertUIFolders(Object inputElement) {
		Object[] elements = getChildren(inputElement);
		for (int i = 0; i < elements.length; i++) {
			Object element = elements[i];
			if (element instanceof MethodPlugin) {
				insertUIFolders((MethodPlugin) element);
			}
		}
	}

}