/*****************************************************************************
 * Copyright (c) 2013 CEA LIST.
 *
 *
 * 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:
 * CEA LIST- Initial API and implementation
 * Nizar GUEDIDI (CEA LIST)- modification
 *
 ****************************************************************************/
package org.eclipse.papyrus.sysml.diagram.requirement.provider;

import java.util.HashSet;
import java.util.Set;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.gmf.runtime.emf.type.core.IElementType;
import org.eclipse.gmf.runtime.emf.type.core.IHintedType;
import org.eclipse.papyrus.uml.diagram.common.stereotype.IStereotypePropertyReferenceEdgeAdvice;

/**
 * <pre>
 * This class provides graphical type id (used as View type) for
 * domain element according to their actual or expected graphical
 * container type.
 * </pre>
 */
public class GraphicalTypeRegistry implements IGraphicalTypeRegistry {

	/** A Set containing all known node graphical types */
	protected Set<String> knownNodes = new HashSet<String>();

	/** A Set containing all known edge graphical types */
	protected Set<String> knownEdges = new HashSet<String>();

	/** Default constructor */
	public GraphicalTypeRegistry() {

		// Fill known edges set
		knownEdges.add(ElementTypes.ABSTRACTION.getSemanticHint());
		knownEdges.add(ElementTypes.DEPENDENCY.getSemanticHint());
		knownEdges.add(ElementTypes.REALIZATION.getSemanticHint());
		knownEdges.add(ElementTypes.PACKAGE_IMPORT.getSemanticHint());
		knownEdges.add(ElementTypes.COMMENT_ANNOTATED_ELEMENT.getSemanticHint());
		knownEdges.add(ElementTypes.CONSTRAINT_CONSTRAINED_ELEMENT.getSemanticHint());

		// Fill known nodes set (primary nodes)
		knownNodes.add(ElementTypes.PACKAGE.getSemanticHint());
		knownNodes.add(ElementTypes.PACKAGE_CN.getSemanticHint());
		knownNodes.add(ElementTypes.CLASS.getSemanticHint());
		knownNodes.add(ElementTypes.CLASS_CN.getSemanticHint());
		knownNodes.add(ElementTypes.DEFAULT_NAMED_ELEMENT.getSemanticHint());
		knownNodes.add(ElementTypes.COMMENT.getSemanticHint());
		knownNodes.add(ElementTypes.COMMENT_CN.getSemanticHint());
		knownNodes.add(ElementTypes.CONSTRAINT.getSemanticHint());
		knownNodes.add(ElementTypes.CONSTRAINT_CN.getSemanticHint());

		// Fill known nodes set (child label nodes)
		knownNodes.add(ElementTypes.CLASS_PROPERTY_CLN.getSemanticHint());
		knownNodes.add(ElementTypes.CLASS_RECEPTION_CLN.getSemanticHint());
		knownNodes.add(ElementTypes.CLASS_OPERATION_CLN.getSemanticHint());
		knownNodes.add(ElementTypes.CLASS_CLASS_CLN.getSemanticHint());
		knownNodes.add(ElementTypes.CLASS_INTERFACE_CLN.getSemanticHint());
		knownNodes.add(ElementTypes.CLASS_ENUMERATION_CLN.getSemanticHint());
		knownNodes.add(ElementTypes.CLASS_PRIMITIVE_TYPE_CLN.getSemanticHint());
		knownNodes.add(ElementTypes.CLASS_DATA_TYPE_CLN.getSemanticHint());
		knownNodes.add(ElementTypes.CLASS_SIGNAL_CLN.getSemanticHint());
		knownEdges.add(IStereotypePropertyReferenceEdgeAdvice.STEREOTYPE_PROPERTY_REFERENCE_EDGE_HINT);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public String getEdgeGraphicalType(EObject domainElement) {

		String graphicalType = UNDEFINED_TYPE;
		if (domainElement == null) {
			return UNDEFINED_TYPE;
		}
		if (domainElement instanceof org.eclipse.uml2.uml.Abstraction) {
			graphicalType = ElementTypes.ABSTRACTION.getSemanticHint();
		}
		if (domainElement instanceof org.eclipse.uml2.uml.Dependency) {
			graphicalType = ElementTypes.DEPENDENCY.getSemanticHint();
		}
		if (domainElement instanceof org.eclipse.uml2.uml.Realization) {
			graphicalType = ElementTypes.REALIZATION.getSemanticHint();
		}
		if (domainElement instanceof org.eclipse.uml2.uml.PackageImport) {
			graphicalType = ElementTypes.PACKAGE_IMPORT.getSemanticHint();
		}
		return graphicalType;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public String getEdgeGraphicalType(IElementType elementType) {
		if (elementType instanceof IHintedType) {
			String semanticHint = ((IHintedType) elementType).getSemanticHint();
			return getEdgeGraphicalType(semanticHint);
		}

		return UNDEFINED_TYPE;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public String getEdgeGraphicalType(String proposedType) {
		if (isKnownEdgeType(proposedType)) {
			return proposedType;
		}

		return UNDEFINED_TYPE;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public String getNodeGraphicalType(EObject domainElement, String containerType) {

		String graphicalType = UNDEFINED_TYPE;
		if ((containerType == null) || (domainElement == null)) {
			return UNDEFINED_TYPE;
		}

		if (domainElement instanceof org.eclipse.uml2.uml.Package) {
			if (ElementTypes.DIAGRAM_ID.equals(containerType)) { // Package TopNode
				graphicalType = ElementTypes.PACKAGE.getSemanticHint();
			}
			if (ElementTypes.PACKAGE_CN_COMPARTMENT_PACKAGEABLE_ELEMENT_HINT.equals(containerType)) { // Package ChildNode
				graphicalType = ElementTypes.PACKAGE_CN.getSemanticHint();
			}
			if (ElementTypes.PACKAGE_COMPARTMENT_PACKAGEABLE_ELEMENT_HINT.equals(containerType)) { // Package ChildNode
				graphicalType = ElementTypes.PACKAGE_CN.getSemanticHint();
			}

		}

		if (domainElement instanceof org.eclipse.uml2.uml.Class) {
			if (ElementTypes.DIAGRAM_ID.equals(containerType)) { // Class TopNode
				graphicalType = ElementTypes.CLASS.getSemanticHint();
			}
			if (ElementTypes.PACKAGE_CN_COMPARTMENT_PACKAGEABLE_ELEMENT_HINT.equals(containerType)) { // Class ChildNode
				graphicalType = ElementTypes.CLASS_CN.getSemanticHint();
			}
			if (ElementTypes.PACKAGE_COMPARTMENT_PACKAGEABLE_ELEMENT_HINT.equals(containerType)) { // Class ChildNode
				graphicalType = ElementTypes.CLASS_CN.getSemanticHint();
			}

			if (ElementTypes.CLASS_CN_COMPARTMENT_NESTED_CLASSIFIER_HINT.equals(containerType)) { // Class ChildLabelNode
				graphicalType = ElementTypes.CLASS_CLASS_CLN.getSemanticHint();
			}
			if (ElementTypes.CLASS_COMPARTMENT_NESTED_CLASSIFIER_HINT.equals(containerType)) { // Class ChildLabelNode
				graphicalType = ElementTypes.CLASS_CLASS_CLN.getSemanticHint();
			}
		}

		if (domainElement instanceof org.eclipse.uml2.uml.NamedElement) {
			if (ElementTypes.DIAGRAM_ID.equals(containerType)) { // NamedElement TopNode
				graphicalType = ElementTypes.DEFAULT_NAMED_ELEMENT.getSemanticHint();
			}

		}

		if (domainElement instanceof org.eclipse.uml2.uml.Comment) {
			if (ElementTypes.DIAGRAM_ID.equals(containerType)) { // Comment TopNode
				graphicalType = ElementTypes.COMMENT.getSemanticHint();
			}
			if (ElementTypes.PACKAGE_CN_COMPARTMENT_PACKAGEABLE_ELEMENT_HINT.equals(containerType)) { // Comment ChildNode
				graphicalType = ElementTypes.COMMENT_CN.getSemanticHint();
			}
			if (ElementTypes.PACKAGE_COMPARTMENT_PACKAGEABLE_ELEMENT_HINT.equals(containerType)) { // Comment ChildNode
				graphicalType = ElementTypes.COMMENT_CN.getSemanticHint();
			}

		}

		if (domainElement instanceof org.eclipse.uml2.uml.Constraint) {
			if (ElementTypes.DIAGRAM_ID.equals(containerType)) { // Constraint TopNode
				graphicalType = ElementTypes.CONSTRAINT.getSemanticHint();
			}
			if (ElementTypes.PACKAGE_CN_COMPARTMENT_PACKAGEABLE_ELEMENT_HINT.equals(containerType)) { // Constraint ChildNode
				graphicalType = ElementTypes.CONSTRAINT_CN.getSemanticHint();
			}
			if (ElementTypes.PACKAGE_COMPARTMENT_PACKAGEABLE_ELEMENT_HINT.equals(containerType)) { // Constraint ChildNode
				graphicalType = ElementTypes.CONSTRAINT_CN.getSemanticHint();
			}

		}

		if (domainElement instanceof org.eclipse.uml2.uml.Property) {

			if (ElementTypes.CLASS_COMPARTMENT_ATTRIBUTE_HINT.equals(containerType)) { // Property ChildLabelNode
				graphicalType = ElementTypes.CLASS_PROPERTY_CLN.getSemanticHint();
			}
			if (ElementTypes.CLASS_CN_COMPARTMENT_ATTRIBUTE_HINT.equals(containerType)) { // Property ChildLabelNode
				graphicalType = ElementTypes.CLASS_PROPERTY_CLN.getSemanticHint();
			}
		}

		if (domainElement instanceof org.eclipse.uml2.uml.Reception) {

			if (ElementTypes.CLASS_COMPARTMENT_OPERATION_HINT.equals(containerType)) { // Reception ChildLabelNode
				graphicalType = ElementTypes.CLASS_RECEPTION_CLN.getSemanticHint();
			}
			if (ElementTypes.CLASS_CN_COMPARTMENT_OPERATION_HINT.equals(containerType)) { // Reception ChildLabelNode
				graphicalType = ElementTypes.CLASS_RECEPTION_CLN.getSemanticHint();
			}
		}

		if (domainElement instanceof org.eclipse.uml2.uml.Operation) {

			if (ElementTypes.CLASS_COMPARTMENT_OPERATION_HINT.equals(containerType)) { // Operation ChildLabelNode
				graphicalType = ElementTypes.CLASS_OPERATION_CLN.getSemanticHint();
			}
			if (ElementTypes.CLASS_CN_COMPARTMENT_OPERATION_HINT.equals(containerType)) { // Operation ChildLabelNode
				graphicalType = ElementTypes.CLASS_OPERATION_CLN.getSemanticHint();
			}
		}

		if (domainElement instanceof org.eclipse.uml2.uml.Interface) {

			if (ElementTypes.CLASS_COMPARTMENT_NESTED_CLASSIFIER_HINT.equals(containerType)) { // Interface ChildLabelNode
				graphicalType = ElementTypes.CLASS_INTERFACE_CLN.getSemanticHint();
			}
			if (ElementTypes.CLASS_CN_COMPARTMENT_NESTED_CLASSIFIER_HINT.equals(containerType)) { // Interface ChildLabelNode
				graphicalType = ElementTypes.CLASS_INTERFACE_CLN.getSemanticHint();
			}
		}

		if (domainElement instanceof org.eclipse.uml2.uml.Enumeration) {

			if (ElementTypes.CLASS_CN_COMPARTMENT_NESTED_CLASSIFIER_HINT.equals(containerType)) { // Enumeration ChildLabelNode
				graphicalType = ElementTypes.CLASS_ENUMERATION_CLN.getSemanticHint();
			}
			if (ElementTypes.CLASS_COMPARTMENT_NESTED_CLASSIFIER_HINT.equals(containerType)) { // Enumeration ChildLabelNode
				graphicalType = ElementTypes.CLASS_ENUMERATION_CLN.getSemanticHint();
			}
		}

		if (domainElement instanceof org.eclipse.uml2.uml.PrimitiveType) {

			if (ElementTypes.CLASS_CN_COMPARTMENT_NESTED_CLASSIFIER_HINT.equals(containerType)) { // PrimitiveType ChildLabelNode
				graphicalType = ElementTypes.CLASS_PRIMITIVE_TYPE_CLN.getSemanticHint();
			}
			if (ElementTypes.CLASS_COMPARTMENT_NESTED_CLASSIFIER_HINT.equals(containerType)) { // PrimitiveType ChildLabelNode
				graphicalType = ElementTypes.CLASS_PRIMITIVE_TYPE_CLN.getSemanticHint();
			}
		}

		if (domainElement instanceof org.eclipse.uml2.uml.DataType) {

			if (ElementTypes.CLASS_CN_COMPARTMENT_NESTED_CLASSIFIER_HINT.equals(containerType)) { // DataType ChildLabelNode
				graphicalType = ElementTypes.CLASS_DATA_TYPE_CLN.getSemanticHint();
			}
			if (ElementTypes.CLASS_COMPARTMENT_NESTED_CLASSIFIER_HINT.equals(containerType)) { // DataType ChildLabelNode
				graphicalType = ElementTypes.CLASS_DATA_TYPE_CLN.getSemanticHint();
			}
		}

		if (domainElement instanceof org.eclipse.uml2.uml.Signal) {

			if (ElementTypes.CLASS_CN_COMPARTMENT_NESTED_CLASSIFIER_HINT.equals(containerType)) { // Signal ChildLabelNode
				graphicalType = ElementTypes.CLASS_SIGNAL_CLN.getSemanticHint();
			}
			if (ElementTypes.CLASS_COMPARTMENT_NESTED_CLASSIFIER_HINT.equals(containerType)) { // Signal ChildLabelNode
				graphicalType = ElementTypes.CLASS_SIGNAL_CLN.getSemanticHint();
			}
		}

		return graphicalType;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public String getNodeGraphicalType(IElementType elementType, String containerType) {
		if (elementType instanceof IHintedType) {
			String semanticHint = ((IHintedType) elementType).getSemanticHint();
			return getNodeGraphicalType(semanticHint, containerType);
		}

		return UNDEFINED_TYPE;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public String getNodeGraphicalType(String proposedType, String containerType) {
		if (isKnownNodeType(proposedType)) {
			return proposedType;
		}

		return UNDEFINED_TYPE;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public boolean isKnownEdgeType(String type) {
		return knownEdges.contains(type);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public boolean isKnownNodeType(String type) {
		return knownNodes.contains(type);
	}
}
