/**
 *  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.api;

import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.uml2.uml.Action;
import org.eclipse.uml2.uml.Activity;
import org.eclipse.uml2.uml.OpaqueAction;


/**
 * Interface that declares model transformation for Data
 *
 */
public interface IModelTransfo {
	/**
	 * return a command to create an abstraction from a gieven Data
	 * @param domain
	 * @param data
	 * @return  a command, it is never null
	 */
	public Command getAbstractionDataCommand(TransactionalEditingDomain domain, org.eclipse.uml2.uml.Element data);
	
	/**
	 * Return a command that create a DFD in the design package (owner) from a DFD of the RequirementPackage 
	 * @param domain domain to execute command
	 * @param owner a package that contain the new DFD
	 * @param reqSource the DFD source
	 * @return a command
	 */
	public Command getCreateProcessModelFromReq(TransactionalEditingDomain domain, org.eclipse.uml2.uml.Package owner,org.eclipse.uml2.uml.Activity ReqDFDSource);

	/**
	 * Return a command that transform a process to a process call
	 * @param domain in order to execute the command
	 * @param process that will be transform into a call process
	 * @return the command
	 */
	public Command getCallProcessToProcessCommand(TransactionalEditingDomain domain, OpaqueAction callProcess );
	
	/**
	 * Return a command that transform a process (Action) to a process call
	 * @param domain
	 * @param process
	 * @return
	 */
	public Command getActionCallProcessToProcessCommand(TransactionalEditingDomain domain, Action actionCallProcess);
	
	/**
	 * Return a command that transforms all the CallProcess within and Activity DFD to a Process (Activity)
	 * @param domain
	 * @param activityDFD
	 * @return
	 */
	public Command getAllCallProcessToProcessCommand(TransactionalEditingDomain domain, Activity activityDFD);

	/**
	 * Applies the PDPbDesign profile to an Activity diagram according to DFD definition
	 * @param domain
	 * @param activityDFD
	 * @return
	 */
	public Command getApplyPDPbDProfileToActivityDFDCommand(TransactionalEditingDomain domain, Activity activityDFD);
	
	/**
	 * Instantiate a GDPR pattern to ensure consent over personal data processed 
	 * @param domain
	 * @param process
	 * @return
	 */
	public Command getInstantiateGDPRConsentPatternCommand(TransactionalEditingDomain domain, Activity process);
	
	/**
	 * Instantiate a GDPR pattern to notify the data subject in case of personal data breach
	 * @param domain
	 * @param process
	 * @return
	 */
	public Command getInstantiateGDPRNotificationsPatternCommand(TransactionalEditingDomain domain, Activity process);

}
