/**
 *  Copyright (c)2020 CEA LIST, Committer Name, and others.
 * 
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License 2.0
 *  which accompanies this distribution, and is available at
 *  https://www.eclipse.org/legal/epl-2.0/
 * 
 *  SPDX-License-Identifier: EPL-2.0
 * 
 *  Contributors:
 *  CEA LIST - Initial API and implementation
 *  Gabriel Pedroza (CEA LIST) gabriel.pedroza@cea.fr
 * 
 */
package org.eclipse.papyrus.pdp4eng.designer.controller.internal.processcreation;

import org.eclipse.uml2.uml.Activity;
import org.eclipse.uml2.uml.ActivityParameterNode;
import org.eclipse.uml2.uml.DataStoreNode;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.NamedElement;
import org.eclipse.uml2.uml.UMLFactory;

public class DataStoreProcessCreation implements IProcessCreation {



	private boolean seekParameter;
	private boolean sourceParameter;
	@Override
	public Element createElement(Element dataStore, Element activity) {
		if( dataStore instanceof DataStoreNode) {
			DataStoreNode dataStoreNode=(DataStoreNode)dataStore;
			if( dataStoreNode.getIncomings().size()==0 && sourceParameter) {
				ActivityParameterNode activityParameterNode= UMLFactory.eINSTANCE.createActivityParameterNode();
				((Activity) activity).getOwnedNodes().add(activityParameterNode);
				activityParameterNode.setName(((DataStoreNode)dataStore).getName());
				ProcessBuilder.createSatisfy((NamedElement)activityParameterNode, (NamedElement)dataStore);
			}
			else if( dataStoreNode.getOutgoings().size()==0&& seekParameter) {
				ActivityParameterNode activityParameterNode= UMLFactory.eINSTANCE.createActivityParameterNode();
				((Activity) activity).getOwnedNodes().add(activityParameterNode);
				activityParameterNode.setName(((DataStoreNode)dataStore).getName());
				ProcessBuilder.createSatisfy((NamedElement)activityParameterNode, (NamedElement)dataStore);
			}
			else {
				DataStoreNode aDataStoreNode= UMLFactory.eINSTANCE.createDataStoreNode();
				((Activity) activity).getOwnedNodes().add(aDataStoreNode);
				aDataStoreNode.setName(((DataStoreNode)dataStore).getName());
				ProcessBuilder.createSatisfy((NamedElement)aDataStoreNode, (NamedElement)dataStore);
				return aDataStoreNode;
			}
		}
		return null;
	}
	
	public void generateParameterForSeek(boolean value) {
		this.seekParameter=value;
	}
	public void generateParameterForSource(boolean value) {
		this.sourceParameter=value;
	}
}
