/*******************************************************************************
 *
 * Copyright (c) 2015 Intecs SpA 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 * Laura Baracchi  laura.baracchi@intecs.it  - initial API and implementation and/or initial documentation
 *******************************************************************************/
package org.polarsys.chess.m2m.handlers;

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

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.window.Window;
import org.eclipse.m2m.internal.qvt.oml.emf.util.ModelContent;
import org.eclipse.papyrus.MARTE.MARTE_AnalysisModel.SAM.SaAnalysisContext;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.uml2.uml.Class;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.Model;
import org.eclipse.uml2.uml.Stereotype;
import org.polarsys.chess.chessmlprofile.Predictability.RTComponentModel.CHRtPortSlot;
import org.polarsys.chess.chessmlprofile.util.Constants;
import org.polarsys.chess.core.util.AnalysisResultData;
import org.polarsys.chess.core.util.CHESSProjectSupport;
import org.polarsys.chess.core.util.HWAnalysisResultData;
import org.polarsys.chess.core.util.uml.UMLUtils;
import org.polarsys.chess.m2m.Activator;
import org.polarsys.chess.m2m.transformations.TransUtil;
import org.polarsys.chess.m2m.ui.CompareSchedResultDialog;


/**
 * The Class CompareAnalysisResultsHandler.
 *
 * @since 0.9
 */
public class CompareAnalysisResultsHandler extends AbstractHandler {

	/* (non-Javadoc)
	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
	 */
	@Override
	public Object execute(ExecutionEvent event) throws ExecutionException {
		EList<EObject> selectedObjects = UMLUtils.getTwoSelectedElements();
		if (selectedObjects.size()!=2) {
			CHESSProjectSupport.printlnToCHESSConsole("User must select two <<SaAnalysisContext>> elements for analysis results comparison!");
			return null;
		}
		
		EObject selection1 = selectedObjects.get(0);
		EObject selection2 = selectedObjects.get(1);
		List<AnalysisResultData> listData1 = new BasicEList<AnalysisResultData>();
		List<AnalysisResultData> listData2 = new BasicEList<AnalysisResultData>();
		List<HWAnalysisResultData> listHWData1 = new BasicEList<HWAnalysisResultData>();
		List<HWAnalysisResultData> listHWData2 = new BasicEList<HWAnalysisResultData>();
		String analysisContextName1 = "";
		String analysisContextName2 = "";
				
		Element element1 = (Element)selection1;
		
		if (element1.getAppliedStereotype(Constants.MARTE_SaAnalysisContext)!=null) {
			Stereotype saAnalysisContextStereo = element1.getAppliedStereotype(Constants.MARTE_SaAnalysisContext);
			SaAnalysisContext analysisContext1 = (SaAnalysisContext) element1.getStereotypeApplication(saAnalysisContextStereo);			
			analysisContextName1 = analysisContext1.getBase_NamedElement().getName();
			//System.out.println("analysisContextName1="+analysisContextName1);
			listData1 = UMLUtils.getAnalysisResults((Class) element1);	
			listHWData1 = UMLUtils.getHWAnalysisResults((Class)element1);
		}
		else {
			CHESSProjectSupport.printlnToCHESSConsole("User must select two <<SaAnalysisContext>> elements for analysis results comparison!");
			return null;
		}
		
		Element element2 = (Element)selection2;
		if (element2.getAppliedStereotype(Constants.MARTE_SaAnalysisContext)!=null) {
			Stereotype saAnalysisContextStereo = element2.getAppliedStereotype(Constants.MARTE_SaAnalysisContext);
			SaAnalysisContext analysisContext2 = (SaAnalysisContext) element2.getStereotypeApplication(saAnalysisContextStereo);
			analysisContextName2 = analysisContext2.getBase_NamedElement().getName();
			listData2 = UMLUtils.getAnalysisResults((Class) element2);
			listHWData2 = UMLUtils.getHWAnalysisResults((Class)element2);
		}
		else {
			CHESSProjectSupport.printlnToCHESSConsole("User must select two <<SaAnalysisContext>> elements for analysis results comparison!");
			return null;
		}
		
		openComparedAnalysisReport(analysisContextName1, analysisContextName2, listData1, listData2, listHWData1, listHWData2);
				
		return null;
	}

	/**
	 * Opens a simple, user-friendly report that displays two analysis results 
	 * corresponding to the two input analysisContexts.
	 *
	 * @param analysisContextName1 the analysis context name 1
	 * @param analysisContextName2 the analysis context name 2
	 * @param listAnalysisResult1 the list analysis result 1
	 * @param listAnalysisResult2 the list analysis result 2
	 * @param listHWData1 the list HW data 1
	 * @param listHWData2 the list HW data 2
	 */
	private void openComparedAnalysisReport(final String analysisContextName1, 
			final String analysisContextName2, 
			final List<AnalysisResultData> listAnalysisResult1,
			final List<AnalysisResultData> listAnalysisResult2, 
			final List<HWAnalysisResultData> listHWData1,
			final List<HWAnalysisResultData> listHWData2) {		

		if (listAnalysisResult1.size() == 0 && listAnalysisResult2.size()==0) {
			CHESSProjectSupport.printlnToCHESSConsole("User must select two <<SaAnalysisContext>> elements for analysis results comparison!");
			return;
		}
		//and open a simple, user-friendly report
		
		
		Shell activeShell = Display.getDefault().getActiveShell();
		CompareSchedResultDialog compareResultsDialog = new CompareSchedResultDialog(activeShell, analysisContextName1, 
				analysisContextName2, listAnalysisResult1, 
				listAnalysisResult2, listHWData1, listHWData2, "Compare analysis results");
		if (compareResultsDialog.open() == Window.OK) {
			
		}
	}
	
		
}
