/*********************************************************************
* Copyright (c) 2005, 2019 SAP SE
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
*    SAP SE - initial API, implementation and documentation
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipse.graphiti.testtool.ecore.features.association;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.context.ICreateConnectionContext;
import org.eclipse.graphiti.features.context.impl.AddConnectionContext;
import org.eclipse.graphiti.features.impl.AbstractCreateConnectionFeature;
import org.eclipse.graphiti.mm.pictograms.Anchor;
import org.eclipse.graphiti.mm.pictograms.Connection;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;

/**
 * The Class TestCreateAssociationFeature.
 */
public class TestCreateAssociationFeature extends AbstractCreateConnectionFeature {

	/**
	 * Instantiates a new test create association feature.
	 * 
	 * @param fp
	 *            the fp
	 */
	public TestCreateAssociationFeature(IFeatureProvider fp) {
		/*
		 * provide name and description for the UI, e.g. the palette
		 */
		super(fp, "Association", "create association");
	}

	public boolean canCreate(ICreateConnectionContext context) {
		EClass source = getEClass(context.getSourceAnchor());
		EClass target = getEClass(context.getTargetAnchor());

		if (source != null && target != null && source != target) {
			return true;
		}
		return false;
	}

	public boolean canStartConnection(ICreateConnectionContext context) {
		/*
		 * return true if start anchor belongs to a EClass
		 */
		if (getEClass(context.getSourceAnchor()) != null) {
			return true;
		}
		return false;
	}

	public Connection create(ICreateConnectionContext context) {
		Connection newConnection = null;

		// get eclasses which should be connected
		EClass source = getEClass(context.getSourceAnchor());
		EClass target = getEClass(context.getTargetAnchor());

		if (source != null && target != null) {

			// create business object for the new connection
			EReference association = createAssociation(source, target);

			// use existing add feature for the creation of the graphical
			// representation
			AddConnectionContext addContext = new AddConnectionContext(context.getSourceAnchor(), context.getTargetAnchor());
			addContext.setNewObject(association);
			PictogramElement pe = getFeatureProvider().addIfPossible(addContext);
			if (pe instanceof Connection) {
				newConnection = (Connection) pe;

				// link new pictogram element with business object
				link(newConnection, association);
			}

		}

		return newConnection;
	}

	/**
	 * If the parent of the anchor is connected with an EClass, this method <br>
	 * returns the EClass.
	 * 
	 * @param anchor
	 * @return the EClass or null if no EClass is connected
	 */
	private EClass getEClass(Anchor anchor) {
		if (anchor != null) {
			Object eObject = getBusinessObjectForPictogramElement(anchor.getParent());
			if (eObject instanceof EClass) {
				return (EClass) eObject;
			}
		}
		return null;
	}

	/**
	 * Creates the business object(s) for the new connection between the two
	 * classes.<br>
	 * It creates an association with two association ends which both point to
	 * an EClass.
	 * 
	 * @param source
	 * @param target
	 * @return the newly created association
	 */
	private EReference createAssociation(EClass source, EClass target) {

		EReference eReference = EcoreFactory.eINSTANCE.createEReference();
		eReference.setName("new EReference"); //$NON-NLS-1$

		eReference.setEType(target);
		eReference.setLowerBound(0);
		eReference.setUpperBound(-1);
		source.getEStructuralFeatures().add(eReference);

		return eReference;
	}

}
