/*
-----------------------------------------------------------------------
--          			CHESS M2M plugin							 --
--                                                                   --
--                    Copyright (C) 2011-2012                        --
--                 University of Padova, ITALY                       --
--                                                                   --
-- Author: Alessandro Zovi         azovi@math.unipd.it 		         --
--                                                                   --
-- 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-v20.html                         --
-----------------------------------------------------------------------
*/

package org.polarsys.chess.m2m.backpropagation;

import static org.polarsys.chess.core.util.CHESSProjectSupport.printlnToCHESSConsole;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.m2m.internal.qvt.oml.emf.util.ModelContent;
import org.eclipse.m2m.internal.qvt.oml.trace.EMappingContext;
import org.eclipse.m2m.internal.qvt.oml.trace.EMappingResults;
import org.eclipse.m2m.internal.qvt.oml.trace.Trace;
import org.eclipse.m2m.internal.qvt.oml.trace.TraceRecord;
import org.eclipse.m2m.internal.qvt.oml.trace.VarParameterValue;
import org.eclipse.papyrus.MARTE.MARTE_AnalysisModel.GQAM.GaResourcesPlatform;
import org.eclipse.papyrus.MARTE.MARTE_AnalysisModel.SAM.SaAnalysisContext;
import org.eclipse.papyrus.MARTE.MARTE_AnalysisModel.SAM.SaCommHost;
import org.eclipse.papyrus.MARTE.MARTE_AnalysisModel.SAM.SaEndtoEndFlow;
import org.eclipse.papyrus.MARTE.MARTE_AnalysisModel.SAM.SaExecHost;
import org.eclipse.papyrus.MARTE.MARTE_DesignModel.SRM.SW_Interaction.SwMutualExclusionResource;
import org.eclipse.papyrus.editor.PapyrusMultiDiagramEditor;
import org.eclipse.uml2.uml.Activity;
import org.eclipse.uml2.uml.Comment;
import org.eclipse.uml2.uml.Component;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.InstanceSpecification;
import org.eclipse.uml2.uml.Interaction;
import org.eclipse.uml2.uml.NamedElement;
import org.eclipse.uml2.uml.Slot;
import org.polarsys.chess.chessmlprofile.Core.CHGaResourcePlatform;
import org.polarsys.chess.chessmlprofile.Predictability.DeploymentConfiguration.HardwareBaseline.CH_HwBus;
import org.polarsys.chess.chessmlprofile.Predictability.DeploymentConfiguration.HardwareBaseline.CH_HwComputingResource;
import org.polarsys.chess.chessmlprofile.Predictability.DeploymentConfiguration.HardwareBaseline.CH_HwProcessor;
import org.polarsys.chess.chessmlprofile.Predictability.RTComponentModel.CHRtSpecification;
import org.polarsys.chess.core.util.uml.UMLUtils;
import org.polarsys.chess.m2m.transformations.TransUtil;



/**
 * The Class implements the back propagation of timing analysis results.
 * The back annotation of results to CHRtSpecifications is no more required;
 * currently it is used only to allow visualization of analysis results in the dedicated dialogs;
 * The way dialogs retrieve the information should be changed; then this class could be removed.
 * @deprecated
 */
@Deprecated
public class BackpropagationFullVERDE{

	/** The rules. */
	protected static List<BackpropagationRule> rules = new ArrayList<BackpropagationRule>();

	/**
	 * Process qvto trace file.
	 *
	 * @param editor the current active editor
	 * @param model the model analyzed with MAST
	 * @throws Exception the exception
	 */
	public static void processQVTOTraceFile(PapyrusMultiDiagramEditor editor, IFile model) throws Exception {
		printlnToCHESSConsole("*** CHESS PSM->PIM backpropagation ***");
		ModelContent inModel = TransUtil.loadModel(model);		
		Resource inResource = inModel.getResourceSet().getResource(URI.createURI(model.getLocationURI().toString()), true);
		
		String modelURI = URI.createPlatformResourceURI(model.getFullPath().toString(), true).toString();
		String strTraceUri = modelURI.substring(0,modelURI.lastIndexOf('.') + 1) + "qvtotrace";
		
		inResource = inModel.getResourceSet().getResource(URI.createURI(strTraceUri), true);
		ModelContent traceModel = new ModelContent(inResource.getContents());
		
		Trace trace = (Trace) traceModel.getContent().get(0);
		for (TraceRecord rec: trace.getTraceRecords()) {
			EMappingContext ctx = rec.getContext();
			//printlnToCHESSConsole("Parsing trace: " + rec.getMappingOperation().getName());
			EMappingResults res = rec.getResult();
			EList<VarParameterValue> ress = res.getResult();
			EObject outEl = null;
			if (ress.isEmpty()){
				// if the mapping has no output, i.e. it is a INOUT mapping
				continue;
			}else{ 
				outEl = ress.get(0).getValue().getModelElement();
			}
			EObject inEl = ctx.getContext().getValue().getModelElement();
				
			for (BackpropagationRule rule : rules) {
				if (rule.getInputType().isInstance(inEl) && rule.getOutputType().isInstance(outEl)){
					rule.rule(inEl, outEl, rec);
				}
			}
			Resource inputResource = inEl.eResource();
			inputResource.save(null);
			}
		
		printlnToCHESSConsole("*** End of CHESS PSM->PIM backpropagation   ***");
	}
	
	/**
	 * The Class BackpropagationRule.
	 *
	 * @param <I> the generic type
	 * @param <O> the generic type
	 */
	static public abstract class BackpropagationRule<I, O> {
		
		/** The input type. */
		private Class<I> inputType;
		
		/** The output type. */
		private Class<O> outputType;
		
		/**
		 * Gets the input type.
		 *
		 * @return the input type
		 */
		public Class<I> getInputType() {
			return inputType;
		}
		
		/**
		 * Gets the output type.
		 *
		 * @return the output type
		 */
		public Class<O> getOutputType() {
			return outputType;
		}
		
		/**
		 * Instantiates a new backpropagation rule.
		 *
		 * @param inputType the input type
		 * @param outputType the output type
		 */
		public BackpropagationRule(Class<I> inputType, Class<O> outputType) {
			this.inputType = inputType;
			this.outputType = outputType;
			rules.add(this);
		}
		
		/**
		 * Prints the status.
		 *
		 * @param property the property
		 * @param theElement the the element
		 * @param value the value
		 */
		public void printStatus(final String property, final Element theElement, final String value){
			if (value == null || theElement ==null)
				return;
			if ( value.isEmpty())
				return;
			
			String elName = theElement instanceof NamedElement?((NamedElement)theElement).getQualifiedName():theElement.toString();
			StringBuilder s = new StringBuilder(20);
			s.append(property).append(" updated for ").append(elName).append(": ").append(value);
			printlnToCHESSConsole(s.toString());
		}	
		
		/**
		 * Rule.
		 *
		 * @param inEl the in el
		 * @param outEl the out el
		 * @param rec the rec
		 */
		abstract void rule(I inEl, O outEl, TraceRecord rec);
	}
	
		
	/** The CHRT comment2 sa step. */
	/* analysis results are no more propagated to CHRtSpecification
	static BackpropagationRule<InstanceSpecification, Operation> CHRTComment2SaStep = new BackpropagationRule<InstanceSpecification, Operation>(InstanceSpecification.class, Operation.class) {
		@Override
		void rule(InstanceSpecification inEl, Operation outEl, TraceRecord rec) {
			Comment chrt = null;
			Slot slot = null;
			try {
				VarParameterValue v = rec.getParameters().getParameters().get(0); 
				chrt = (Comment) v.getValue().getModelElement();
				
				v = rec.getParameters().getParameters().get(1); 
				slot = (Slot) v.getValue().getModelElement();
			} catch (Exception e) {
				return;
			}
			
			CHRtSpecification in = UMLUtils.getStereotypeApplication(chrt, CHRtSpecification.class);
			SaStep out = UMLUtils.getStereotypeApplication(outEl, SaStep.class);
			IdentifInstance id = UMLUtils.getStereotypeApplication(slot.getOwningInstance(), IdentifInstance.class);
			if (out == null || in == null || id == null)
				return;
			String blockT = out.getBlockT() != null ? "(instance=" + id.getId() + ", " + out.getBlockT().substring(1) : "";
			String respT = !out.getRespT().isEmpty() ? "(instance=" + id.getId() + ", " + out.getRespT().get(0).substring(1) : "";
			
			if (blockT != "")
				in.getBlockT().add(blockT);
			
			if (respT != "")
				in.getRespT().add(respT);
			
			printStatus("'blockT'", in.getContext(), blockT);
			printStatus("'respT'", in.getContext(), respT);
		}
	};*/
	
	/** The Hw computing resource2 sa exec host. */
	static BackpropagationRule<InstanceSpecification, org.eclipse.uml2.uml.Class> HwComputingResource2SaExecHost = new BackpropagationRule<InstanceSpecification, org.eclipse.uml2.uml.Class>(InstanceSpecification.class, org.eclipse.uml2.uml.Class.class) {
		@Override
		void rule(InstanceSpecification inEl, org.eclipse.uml2.uml.Class outEl, TraceRecord rec) {
			CH_HwComputingResource in = UMLUtils.getStereotypeApplication(inEl, CH_HwComputingResource.class);
			SaExecHost out = UMLUtils.getStereotypeApplication(outEl, SaExecHost.class);
			if (in == null || out == null)
				return;
			//String slack = out.getSchSlack();
			String util = !out.getUtilization().isEmpty() ? out.getUtilization().get(0) : "";
			in.setUtilization(util);
			printStatus("'utilization'", inEl, util);
		}
	};
	
	/** The Hw processor2 sa exec host. */
	static BackpropagationRule<InstanceSpecification, org.eclipse.uml2.uml.Class> HwProcessor2SaExecHost = new BackpropagationRule<InstanceSpecification, org.eclipse.uml2.uml.Class>(InstanceSpecification.class, org.eclipse.uml2.uml.Class.class) {
		@Override
		void rule(InstanceSpecification inEl, org.eclipse.uml2.uml.Class outEl, TraceRecord rec) {
			CH_HwProcessor in = UMLUtils.getStereotypeApplication(inEl, CH_HwProcessor.class);
			SaExecHost out = UMLUtils.getStereotypeApplication(outEl, SaExecHost.class);
			if (in == null || out == null)
				return;
			//String slack = out.getSchSlack();
			String util = !out.getUtilization().isEmpty() ? out.getUtilization().get(0) : "";
			in.setUtilization(util);
			printStatus("'utilization'", inEl, util);
		}
	};
	
	/** The Hw bus2 sa comm host. */
	static BackpropagationRule<InstanceSpecification, org.eclipse.uml2.uml.Class> HwBus2SaCommHost = new BackpropagationRule<InstanceSpecification, org.eclipse.uml2.uml.Class>(InstanceSpecification.class, org.eclipse.uml2.uml.Class.class) {
		@Override
		void rule(InstanceSpecification inEl, org.eclipse.uml2.uml.Class outEl, TraceRecord rec) {
			CH_HwBus in = UMLUtils.getStereotypeApplication(inEl, CH_HwBus.class);
			SaCommHost out = UMLUtils.getStereotypeApplication(outEl, SaCommHost.class);
			if (in == null || out == null)
				return;
			//String slack = out.getSchSlack();
			String util = !out.getUtilization().isEmpty() ? out.getUtilization().get(0) : "";
			in.setUtilization(util);
			printStatus("'utilization'", inEl, util);
		}
	};
	
	/** The CH ga resource platform2 sa analysis context. */
	static BackpropagationRule<Component, org.eclipse.uml2.uml.Class> CHGaResourcePlatform2SaAnalysisContext = new BackpropagationRule<Component, org.eclipse.uml2.uml.Class>(Component.class, org.eclipse.uml2.uml.Class.class) {
		@Override
		void rule(Component inEl, org.eclipse.uml2.uml.Class outEl, TraceRecord rec) {
			GaResourcesPlatform in = UMLUtils.getStereotypeApplication(inEl, CHGaResourcePlatform.class);
			SaAnalysisContext out = UMLUtils.getStereotypeApplication(outEl, SaAnalysisContext.class);
			if (in == null || out == null)
				return;
			//String slack = out.getIsSched();
		}
	};
	
	/** The Operation2 sa shared resource. */
	static BackpropagationRule<InstanceSpecification, org.eclipse.uml2.uml.Class> Operation2SaSharedResource = new BackpropagationRule<InstanceSpecification, org.eclipse.uml2.uml.Class>(InstanceSpecification.class, org.eclipse.uml2.uml.Class.class) {
		@Override
		void rule(InstanceSpecification inEl, org.eclipse.uml2.uml.Class outEl, TraceRecord rec) {
			
			Comment chrt = null;
			Slot slot = null;
			try {
				VarParameterValue v = rec.getParameters().getParameters().get(0); 
				chrt = (Comment) v.getValue().getModelElement();
				
				v = rec.getParameters().getParameters().get(1); 
				slot = (Slot) v.getValue().getModelElement();
			} catch (Exception e) {
				return;
			}
			if(chrt == null)
				return;
			
			CHRtSpecification in = UMLUtils.getStereotypeApplication(chrt, CHRtSpecification.class);
			SwMutualExclusionResource out = UMLUtils.getStereotypeApplication(outEl, SwMutualExclusionResource.class);
			if (in == null || out == null)
				return;
			String ceiling = out.getCeiling(); 
			in.setCeiling(ceiling);
			printStatus("'ceiling'", in.getContext(), ceiling);
			//in.setStackSize(out.getCapacity());
		}
	};
	
	
	/** The slot2 end to end work flow. */
	static BackpropagationRule<InstanceSpecification, org.eclipse.uml2.uml.Activity> slot2EndToEndWorkFlow = new BackpropagationRule<InstanceSpecification, org.eclipse.uml2.uml.Activity>(InstanceSpecification.class, org.eclipse.uml2.uml.Activity.class) {
		@Override
		void rule(InstanceSpecification inEl, org.eclipse.uml2.uml.Activity outEl, TraceRecord rec) {
			
			
			Comment chrt = null;
			Slot slot = null;
			try {
				VarParameterValue v = rec.getParameters().getParameters().get(0); 
				chrt = (Comment) v.getValue().getModelElement();
				
				v = rec.getParameters().getParameters().get(1); 
				slot = (Slot) v.getValue().getModelElement();
			} catch (Exception e) {
				return;
			}
			
			CHRtSpecification in = UMLUtils.getStereotypeApplication(chrt, CHRtSpecification.class);
			SaEndtoEndFlow out = UMLUtils.getStereotypeApplication(outEl, SaEndtoEndFlow.class);
			if (in == null || out == null)
				return;
			EList<String> e2e = out.getEnd2EndT(); 
			if (e2e != null && !e2e.isEmpty()){
				//check if respT is already added by CHRTComment2SaStep...
				if (in.getRespT().isEmpty()){
						in.getRespT().add(e2e.get(0));
						printStatus("'respT'", in.getContext(), e2e.get(0));
				}
				else
					printStatus("'respT not updated'", in.getContext(), e2e.get(0));
			}	
			//in.setStackSize(out.getCapacity());
		}
	};
	
	/** The Interaction2 end to end work flow. */
	static BackpropagationRule<Interaction, Activity> Interaction2EndToEndWorkFlow = new BackpropagationRule<Interaction, Activity>(Interaction.class, Activity.class) {
		@Override
		void rule(Interaction inEl, Activity outEl, TraceRecord rec) {
			
			//get the end2end worst completion time from PSM end2end flow
			SaEndtoEndFlow psmE2EFlow = UMLUtils.getStereotypeApplication(outEl, SaEndtoEndFlow.class);
			EList<String> end2endT = psmE2EFlow.getEnd2EndT();
			
			//get the analysis result (true/false) from PSM analysis context
			VarParameterValue param = rec.getParameters().getParameters().get(0);
			org.eclipse.uml2.uml.Class psmContext = (org.eclipse.uml2.uml.Class) param.getValue().getModelElement();
			SaAnalysisContext psmAnalysisCtx = UMLUtils.getStereotypeApplication(psmContext, SaAnalysisContext.class);
			String isSched = psmAnalysisCtx.getIsSched();
			
			//update isSched for PIM analysis context
			param = rec.getParameters().getParameters().get(1);
			org.eclipse.uml2.uml.Class pimContext = (org.eclipse.uml2.uml.Class) param.getValue().getModelElement();
			SaAnalysisContext pimAnalysisCtx = UMLUtils.getStereotypeApplication(pimContext, SaAnalysisContext.class);
			pimAnalysisCtx.setIsSched(isSched);
			printStatus("isSched", pimContext, isSched);
			
			//update end2EndT for PIM e2e flow
			param = rec.getParameters().getParameters().get(2);
			Activity pimActivity = (Activity) param.getValue().getModelElement();
			SaEndtoEndFlow pimE2EFlow = UMLUtils.getStereotypeApplication(pimActivity, SaEndtoEndFlow.class);
			pimE2EFlow.getEnd2EndT().clear();
			pimE2EFlow.getEnd2EndT().add(end2endT.get(0));
			printStatus("endToEndT", pimActivity, end2endT.get(0));
		}
	};
}