/*****************************************************************************
* 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
* Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr 
* Gabriel Pedroza (CEA LIST) gabriel.pedroza@cea.fr 
*****************************************************************************/
package org.eclipse.pdp4eng.req.gdprananalysis.internal;

import java.util.Iterator;

import org.eclipse.emf.common.command.Command;
/**
 * Copyright (c) 2019 CEA LIST.
 * 
 * All rights reserved. This program and the accompanying materials
 * are the property of the CEA. 
 * Any use is subject to specific agreement with the CEA.
 * Contributors:
 * 
 * 		Patrick Tessier (CEA LIST) - Initial API and implementation
 * 
 */
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.papyrus.sysml14.requirements.Requirement;
import org.eclipse.uml2.uml.Class;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.Package;
import org.eclipse.uml2.uml.UMLPackage;
import org.eclipse.uml2.uml.util.UMLUtil;
import org.eclipse.uml2.uml.util.UMLUtil.StereotypeApplicationHelper;

import org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Consent;
import org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.DataSubject;
import org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.PersonalData;
import org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Purpose;
import org.eclipse.papyrus.pdp4eng.req.metareq.GDPRRequirements;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.pdp4engReqGDPRPackage;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.PersonalDataRequirement;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.ProcessRequirement;

public class LawfulRequirementCreateCommand extends BasicGDPRRequirementCreateCommand {

	private DataSubject dataSubject;
	public LawfulRequirementCreateCommand(TransactionalEditingDomain domain, Element owner, String id, String text,ProcessRequirement processRequirement, DataSubject dataSubject) {
		super(domain, owner, id, text,processRequirement);
		this.dataSubject= dataSubject;
	}

	@Override
	protected void createRequirement(Package owner, String id, String text) {
		super.createRequirement(owner, id, text);
		if( requirement!=null) {
			StereotypeApplicationHelper stereotypeApplicationHelper = StereotypeApplicationHelper.getInstance(null);
			stereotypeApplicationHelper.applyStereotype(requirement,pdp4engReqGDPRPackage.eINSTANCE.getLawful(),null );
			org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Lawful lawfulReq= (org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Lawful)UMLUtil.getStereotypeApplication(requirement, org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Lawful.class);
			lawfulReq.setProcess(processRequirement);
			for (PersonalData personalData : processRequirement.getPersonaldata()) {
				lawfulReq.getPersonalData().add((PersonalDataRequirement) personalData);
			}
			lawfulReq.setDataSubject(this.dataSubject);
			GDPRRequirements gdprRrequiement= new GDPRRequirements();
			Requirement reqStereotypeAppli= (Requirement)UMLUtil.getStereotypeApplication(requirement, Requirement.class);
			reqStereotypeAppli.setText(""+gdprRrequiement.getDescriptionForLawfulRequirement(lawfulReq));
			
			Command traceCommand=PDP4EngTraceabilityFactory.addTraceabilityToLFR(domain, processRequirement, reqStereotypeAppli);
			traceCommand.execute();

		}


	}

	
}
