//------------------------------------------------------------------------------
// 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.diagram.ui.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EModelElement;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.epf.diagram.ad.edit.parts.ActivityFinalNodeEditPart;
import org.eclipse.epf.diagram.ad.edit.parts.ActivityFinalNodeNameEditPart;
import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNode2EditPart;
import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeEditPart;
import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeName2EditPart;
import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeNameEditPart;
import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowEditPart;
import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowNameEditPart;
import org.eclipse.epf.diagram.ad.edit.parts.DecisionNodeEditPart;
import org.eclipse.epf.diagram.ad.edit.parts.DecisionNodeNameEditPart;
import org.eclipse.epf.diagram.ad.edit.parts.ForkNodeEditPart;
import org.eclipse.epf.diagram.ad.edit.parts.InitialNodeEditPart;
import org.eclipse.epf.diagram.ad.edit.parts.InitialNodeNameEditPart;
import org.eclipse.epf.diagram.ad.edit.parts.JoinNodeEditPart;
import org.eclipse.epf.diagram.ad.edit.parts.MergeNodeEditPart;
import org.eclipse.epf.diagram.ad.edit.parts.MergeNodeNameEditPart;
import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNode2EditPart;
import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNode3EditPart;
import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeEditPart;
import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeName2EditPart;
import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeName3EditPart;
import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeNameEditPart;
import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
import org.eclipse.epf.diagram.core.services.DiagramManager;
import org.eclipse.epf.diagram.ui.DiagramUIPlugin;
import org.eclipse.epf.uma.Activity;
import org.eclipse.epf.uma.Iteration;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.Milestone;
import org.eclipse.epf.uma.Phase;
import org.eclipse.epf.uma.TaskDescriptor;
import org.eclipse.epf.uma.WorkBreakdownElement;
import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.Edge;
import org.eclipse.gmf.runtime.notation.Node;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.uml2.uml.ActivityFinalNode;
import org.eclipse.uml2.uml.ActivityNode;
import org.eclipse.uml2.uml.ActivityParameterNode;
import org.eclipse.uml2.uml.ControlFlow;
import org.eclipse.uml2.uml.DecisionNode;
import org.eclipse.uml2.uml.FinalNode;
import org.eclipse.uml2.uml.ForkNode;
import org.eclipse.uml2.uml.InitialNode;
import org.eclipse.uml2.uml.JoinNode;
import org.eclipse.uml2.uml.MergeNode;
import org.eclipse.uml2.uml.StructuredActivityNode;
import org.eclipse.uml2.uml.UMLFactory;
import org.eclipse.uml2.uml.UMLPackage;

/**
 * A UI service for external ecore map to acess EPF Diagrams and creating
 * diagram elements.
 * 
 * @author Chinh Vo
 * @author Shashidhar Kannoori
 * @author Shilpa Toraskar
 * @since 1.2
 */
public class DiagramUIService implements IDiagramUIService {

	static boolean debug = DiagramUIPlugin.getDefault().isDebugging();

	public static HashMap<String, Class> nodeTypesMap = new HashMap<String, Class>();

	public DiagramUIService() {

		nodeTypesMap.put(IDiagramUIService.ACTIVITY_NODE, Activity.class);
		nodeTypesMap.put(IDiagramUIService.PHASE_NODE, Phase.class);
		nodeTypesMap.put(IDiagramUIService.ITERATION_NODE, Iteration.class);
		nodeTypesMap.put(IDiagramUIService.TASK_DESCRIPTOR_NODE,
				TaskDescriptor.class);
		nodeTypesMap.put(IDiagramUIService.MILESTONE_NODE, Milestone.class);
		nodeTypesMap.put(IDiagramUIService.INITIAL_NODE, InitialNode.class);
		nodeTypesMap.put(IDiagramUIService.FINAL_NODE, FinalNode.class);
		nodeTypesMap.put(IDiagramUIService.FORK_NODE, ForkNode.class);
		nodeTypesMap.put(IDiagramUIService.JOIN_NODE, JoinNode.class);
		nodeTypesMap.put(IDiagramUIService.MERGE_NODE, MergeNode.class);
		nodeTypesMap.put(IDiagramUIService.DECISION_NODE, DecisionNode.class);

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.epf.diagram.ui.service.IDiagramUIService#createActivityDiagram(org.eclipse.epf.uma.Activity)
	 */
	public Diagram createActivityDiagram(Activity activity) {	
		EObject umlActivity = UMLFactory.eINSTANCE.create(UMLPackage.eINSTANCE
				.getActivity());
		if (umlActivity instanceof org.eclipse.uml2.uml.Activity) {
			((org.eclipse.uml2.uml.Activity)umlActivity).setName(activity.getName());
		}
		if (umlActivity instanceof EModelElement) {
			BridgeHelper.associate((EModelElement) umlActivity, activity);
		}
		
		// Create diagram
		Diagram diagram = ViewService.createDiagram(umlActivity, DiagramManager.AD_kind,
				ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
		diagram.setElement(umlActivity);
		if (umlActivity instanceof org.eclipse.uml2.uml.Activity) {
			diagram.setName(activity.getName());
		}
		return diagram;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.epf.diagram.ui.service.IDiagramUIService#createEdge(org.eclipse.gmf.runtime.notation.Diagram,
	 *      org.eclipse.gmf.runtime.notation.View,
	 *      org.eclipse.gmf.runtime.notation.View)
	 */
	public Edge createEdge(Diagram diagram, View source, View target,
			String linkName) {
		org.eclipse.uml2.uml.Activity parentActivity = null;
		EObject obj = diagram.getElement();
		if (obj instanceof org.eclipse.uml2.uml.Activity) {
			parentActivity = (org.eclipse.uml2.uml.Activity) obj;
		}
		if (parentActivity != null) {
			ControlFlow flow = (org.eclipse.uml2.uml.ControlFlow) parentActivity
					.createEdge(linkName = (linkName != null) ? linkName : "",	//$NON-NLS-1$
							UMLPackage.eINSTANCE.getControlFlow());
			if (source != null) {
				if (source.getElement() != null && source.getElement() instanceof ActivityNode)
					flow.setSource((ActivityNode) source.getElement());
			}
			if (target != null) {
				if (target.getElement() != null && target.getElement() instanceof ActivityNode)
					flow.setTarget((ActivityNode) target.getElement());
			}
			if (flow instanceof ControlFlow) {
				Edge edge = ViewService.createEdge(source, target, flow,
						new Integer(ControlFlowEditPart.VISUAL_ID).toString(),
						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
				ViewService.createNode(edge, flow, new Integer(
						ControlFlowNameEditPart.VISUAL_ID).toString(),
						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
				
				if (source != null) {
					edge.setSource(source);				
				}
				if (target != null) {
					edge.setTarget(target);					
				}
				return edge;
			}
		}
		return null;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.epf.diagram.ui.service.IDiagramUIService#createNode(org.eclipse.gmf.runtime.notation.Diagram,
	 *      java.lang.String, java.lang.String)
	 */
	public Node createNode(Diagram diagram, String nodeType, String nodeName) {
		org.eclipse.uml2.uml.Activity parentActivity = null;
		Node notationNode = null;
		EObject obj = diagram.getElement();
		if (obj instanceof org.eclipse.uml2.uml.Activity) {
			parentActivity = (org.eclipse.uml2.uml.Activity) obj;
		}

		if (parentActivity != null) {
			if (nodeType == INITIAL_NODE) {
				ActivityNode umlNode = (InitialNode) parentActivity.createNode(
						nodeName = (nodeName != null) ? nodeName : "",	//$NON-NLS-1$
						UMLPackage.eINSTANCE.getInitialNode());
				notationNode = ViewService.createNode(diagram, umlNode,
						new Integer(InitialNodeEditPart.VISUAL_ID).toString(),
						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
				ViewService.createNode(notationNode, umlNode, new Integer(
						InitialNodeNameEditPart.VISUAL_ID).toString(),
						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
			} else if (nodeType == FINAL_NODE) {
				ActivityNode umlNode = (ActivityFinalNode) parentActivity
						.createNode(nodeName = (nodeName != null) ? nodeName
								: "", UMLPackage.eINSTANCE.getActivityFinalNode());	//$NON-NLS-1$
				notationNode = ViewService.createNode(diagram, umlNode,
						new Integer(ActivityFinalNodeEditPart.VISUAL_ID)
								.toString(),
						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
				ViewService.createNode(notationNode, umlNode, new Integer(
						ActivityFinalNodeNameEditPart.VISUAL_ID).toString(),
						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
			} else if (nodeType == FORK_NODE) {
				ActivityNode umlNode = (ForkNode) parentActivity.createNode(
						nodeName = (nodeName != null) ? nodeName : "",	//$NON-NLS-1$
						UMLPackage.eINSTANCE.getForkNode());
				notationNode = ViewService.createNode(diagram, umlNode,
						new Integer(ForkNodeEditPart.VISUAL_ID).toString(),
						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
			} else if (nodeType == JOIN_NODE) {
				ActivityNode umlNode = (JoinNode) parentActivity.createNode(
						nodeName = (nodeName != null) ? nodeName : "",	//$NON-NLS-1$
						UMLPackage.eINSTANCE.getJoinNode());
				notationNode = ViewService.createNode(diagram, umlNode,
						new Integer(JoinNodeEditPart.VISUAL_ID).toString(),
						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
			} else if (nodeType == DECISION_NODE) {
				ActivityNode umlNode = (DecisionNode) parentActivity
						.createNode(nodeName = (nodeName != null) ? nodeName
								: "", UMLPackage.eINSTANCE.getDecisionNode());	//$NON-NLS-1$
				notationNode = ViewService.createNode(diagram, umlNode,
						new Integer(DecisionNodeEditPart.VISUAL_ID).toString(),
						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
				ViewService.createNode(notationNode, umlNode, new Integer(
						DecisionNodeNameEditPart.VISUAL_ID).toString(),
						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
			} else if (nodeType == MERGE_NODE) {
				ActivityNode umlNode = (MergeNode) parentActivity.createNode(
						nodeName = (nodeName != null) ? nodeName : "",			//$NON-NLS-1$
						UMLPackage.eINSTANCE.getMergeNode());
				notationNode = ViewService.createNode(diagram, umlNode,
						new Integer(MergeNodeEditPart.VISUAL_ID).toString(),
						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
				ViewService.createNode(notationNode, umlNode, new Integer(
						MergeNodeNameEditPart.VISUAL_ID).toString(),
						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
			}
		}

		return notationNode;
	}

	/*	
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.epf.diagram.ui.service.IDiagramUIService#createNode(org.eclipse.gmf.runtime.notation.Diagram,
	 *      org.eclipse.epf.uma.WorkBreakdownElement)
	 */
	public Node createNode(Diagram diagram, WorkBreakdownElement e) {
		org.eclipse.uml2.uml.Activity parentActivity = null;
		Node notationNode = null;
		EObject obj = diagram.getElement();
		if (obj instanceof org.eclipse.uml2.uml.Activity) {
			parentActivity = (org.eclipse.uml2.uml.Activity) obj;
		}
		String name = "";
		if(e.getPresentationName() != null){
			name = e.getPresentationName();
		}else{
			name = e.getName();
		}
		
		if (parentActivity != null) {
			if (e instanceof Phase) {
				// Phase
				ActivityNode umlNode = (StructuredActivityNode) parentActivity
						.createNode(name,
								UMLPackage.eINSTANCE
										.getStructuredActivityNode());

				BridgeHelper.associate(umlNode, ((MethodElement) e));

				notationNode = ViewService.createNode(diagram, umlNode,
						new Integer(StructuredActivityNode2EditPart.VISUAL_ID)
								.toString(),
						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
				ViewService.createNode(notationNode, umlNode, new Integer(
						StructuredActivityNodeName2EditPart.VISUAL_ID)
						.toString(),
						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);

			} else if (e instanceof Iteration) {
				// Iteration
				ActivityNode umlNode = (StructuredActivityNode) parentActivity
						.createNode(name,
								UMLPackage.eINSTANCE
										.getStructuredActivityNode());

				BridgeHelper.associate(umlNode, ((MethodElement) e));

				notationNode = ViewService.createNode(diagram, umlNode,
						new Integer(StructuredActivityNode3EditPart.VISUAL_ID)
								.toString(),
						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
				ViewService.createNode(notationNode, umlNode, new Integer(
						StructuredActivityNodeName3EditPart.VISUAL_ID)
						.toString(),
						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
			} else if (e instanceof Activity) {
				// Activity
				ActivityNode umlNode = (StructuredActivityNode) parentActivity
						.createNode(name,
								UMLPackage.eINSTANCE
										.getStructuredActivityNode());

				BridgeHelper.associate(umlNode, ((MethodElement) e));

				notationNode = ViewService.createNode(diagram, umlNode,
						new Integer(StructuredActivityNodeEditPart.VISUAL_ID)
								.toString(),
						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
				ViewService.createNode(notationNode, umlNode, new Integer(
						StructuredActivityNodeNameEditPart.VISUAL_ID)
						.toString(),
						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
			} else if (e instanceof TaskDescriptor) {
				// Task descriptor
				ActivityNode umlNode = (ActivityParameterNode) parentActivity
						.createNode(name,
								UMLPackage.eINSTANCE.getActivityParameterNode());

				BridgeHelper.associate(umlNode, ((MethodElement) e));

				notationNode = ViewService.createNode(diagram, umlNode,
						new Integer(ActivityParameterNodeEditPart.VISUAL_ID)
								.toString(),
						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
				ViewService
						.createNode(
								notationNode,
								umlNode,
								new Integer(
										ActivityParameterNodeNameEditPart.VISUAL_ID)
										.toString(),
								ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
			} else if (e instanceof Milestone) {
				// Milestone
				ActivityNode umlNode = (ActivityParameterNode) parentActivity
						.createNode(name,
								UMLPackage.eINSTANCE.getActivityParameterNode());

				BridgeHelper.associate(umlNode, ((MethodElement) e));

				notationNode = ViewService.createNode(diagram, umlNode,
						new Integer(ActivityParameterNode2EditPart.VISUAL_ID)
								.toString(),
						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
				ViewService.createNode(notationNode, umlNode, new Integer(
						ActivityParameterNodeName2EditPart.VISUAL_ID)
						.toString(),
						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
			}
		}

		return notationNode;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.epf.diagram.ui.service.IDiagramUIService#getEdges(org.eclipse.gmf.runtime.notation.Diagram)
	 */
	public EList getEdges(Diagram diagram) {
		return diagram.getPersistedEdges();
	}

	/**
	 * Returns all diagram nodes in the diagram
	 * 
	 * @param diagram
	 * @param nodeType
	 * @return
	 */
	public EList getAllNodes(Diagram diagram) {
		if (diagram != null) {
			return diagram.getPersistedChildren();
		}
		return null;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.epf.diagram.ui.service.IDiagramUIService#getNodes(org.eclipse.gmf.runtime.notation.Diagram,
	 *      org.eclipse.epf.uma.Activity, java.lang.String)
	 */
	public List<Node> getNodes(Diagram diagram, Activity activity,
			String nodeType) {
		List<Node> nodes = new ArrayList<Node>();
		if (diagram != null) {
			List allNodes = diagram.getPersistedChildren();

			for (Iterator iter = allNodes.iterator(); iter.hasNext();) {
				Node node = (Node) iter.next();
				EObject element = node.getElement();
				Class classType = (Class) nodeTypesMap.get(nodeType);
				if (element instanceof EModelElement) {
					MethodElement ex = BridgeHelper
							.getMethodElementFromAnnotation(
									(EModelElement) element, activity
											.eResource().getResourceSet());
					if (ex != null && classType.isInstance(ex)) {
						nodes.add(node);
					} else {
						if (classType != null && classType.isInstance(element)) {
							nodes.add(node);
						}
					}
				}
			}
		}
		return nodes;
	}

//	private static Diagram getDiagram(Activity activity, int type,
//			boolean create) {
//		Diagram diagram = null;
//		DiagramManager dMgr = DiagramManager.getInstance(TngUtil
//				.getOwningProcess(activity));
//
//		if (dMgr != null) {
//			try {
//				List list = dMgr.getDiagrams(activity, type);
//				if (!list.isEmpty()) {
//					diagram = (Diagram) list.get(0);
//				}
//				if (diagram == null && create) {
//					diagram = dMgr.createDiagram(activity, type,
//							getDiagramPreferencesHint(type));
//				}
//			} catch (Exception e) {
//				if (debug) {
//					System.out.println("Core error creating a diagram:" //$NON-NLS-1$
//							+ e.getLocalizedMessage());
//				}
//				DiagramUIPlugin.getDefault().getLogger().logError(
//						"Core error creating a diagram:", e); //$NON-NLS-1$
//			} finally {
//				if (dMgr != null) {
//					dMgr.release();
//				}
//			}
//		}
//		return diagram;
//	}

//	public static PreferencesHint getDiagramPreferencesHint(int diagramType) {
//		switch (diagramType) {
//		case IDiagramManager.ACTIVITY_DIAGRAM:
//			return ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT;
//		case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM:
//			return ActivityDetailDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT;
//		case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM:
//			return WPDDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT;
//		}
//		return null;
//	}

//	public static void openDiagram(IEditorPart part, int diagramType,
//			Object selectedObject, Suppression suppression) {
//		try {
//			DiagramEditorInput input = new org.eclipse.epf.diagram.core.part.DiagramEditorInput(
//					selectedObject, suppression, diagramType);
//			DiagramEditorUtil.openDiagramEditor(part.getSite().getPage(),
//					input, getDiagramPreferencesHint(diagramType),
//					new NullProgressMonitor());
//		} catch (RuntimeException e) {
//			DiagramUIPlugin.getDefault().getLogger().logError(e);
//		}
//	}

//	public static Diagram getDiagram(Activity activity, int type) {
//		return getDiagram(activity, type, false);
//	}
}
