/*
-----------------------------------------------------------------------
--                CHESS Live/Batch Validator plugin                  --
--                                                                   --
--                    Copyright (C) 2011-2012                        --
--                 University of Padova, ITALY                       --
--                                                                   --
-- Author: Stefano Puri								                 --
--                                                                   --
-- 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.validator.constraints;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.papyrus.MARTE.MARTE_Foundations.Alloc.Assign;
import org.eclipse.uml2.uml.Classifier;
import org.eclipse.uml2.uml.Component;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.InstanceSpecification;
import org.eclipse.uml2.uml.InstanceValue;
import org.eclipse.uml2.uml.Model;
import org.eclipse.uml2.uml.NamedElement;
import org.eclipse.uml2.uml.Package;
import org.eclipse.uml2.uml.Property;
import org.eclipse.uml2.uml.Slot;
import org.eclipse.uml2.uml.Stereotype;
import org.eclipse.uml2.uml.ValueSpecification;
import org.eclipse.emf.validation.AbstractModelConstraint;
import org.eclipse.emf.validation.IValidationContext;
import org.polarsys.chess.chessmlprofile.ComponentModel.ComponentImplementation;
import org.polarsys.chess.chessmlprofile.Core.CHESS;
import org.polarsys.chess.chessmlprofile.Core.Domain;
import org.polarsys.chess.chessmlprofile.util.Constants;
import org.polarsys.chess.core.profiles.CHESSProfileManager;
import org.polarsys.chess.core.util.uml.ModelError;
import org.polarsys.chess.core.util.uml.UMLUtils;

/**
 * The Class DV_01.
 * DV_01 checks that the ComponentImplementation instance must be deployed on exactly 
 * one processing unit or a functional partition.
 * 20160315 LB Modified for addressing multiple deployments and addressing different needs for Avionic Domain models
 */
public class DV_01 extends AbstractModelConstraint {

	/* (non-Javadoc)
	 * @see org.eclipse.emf.validation.AbstractModelConstraint#validate(org.eclipse.emf.validation.IValidationContext)
	 */
	@Override
	public IStatus validate(IValidationContext ctx) {
		EObject eObject = ctx.getTarget();
		InstanceSpecification instSpec = (InstanceSpecification)eObject;
		IStatus success = ctx.createSuccessStatus();
		String errorMsg = null;

		//<<IdentifInstance>> InstanceSpecification does not need to have an allocation to HW
		if (instSpec.getAppliedStereotype(Constants.CH_IDENTIFINSTANCE)!=null)
			return success;

		Model umlModel = instSpec.getModel();
		Domain theDomain = Domain.CROSS_DOMAIN;
		// Look into the CHESS Model to find if the Domain is Avionics: 
		// only in this case Partitions should be taken into account
		if (umlModel.getAppliedStereotype(Constants.CHESS_MODEL_STEREOTYPE) != null) {
			Stereotype chessModelStereo = umlModel.getAppliedStereotype(Constants.CHESS_MODEL_STEREOTYPE);
			CHESS chessModel = (CHESS) umlModel.getStereotypeApplication(chessModelStereo);
			theDomain = chessModel.getDomain();
		}		

		if (instSpec.getClassifiers().size()!=0) {

			Classifier classifier = instSpec.getClassifiers().iterator().next();
			if (classifier instanceof Component) {
				Component comp = (Component) classifier;
				// Is the component a ComponentImplementation?
				Stereotype compImpl = comp.getAppliedStereotype(Constants.COMPONENT_IMPLEMENTATION);
				if (compImpl!=null) {
					//System.out.println("Looking at "+instSpec.getName());
					// only continue in this verification if we are looking at a leaf component.
					if (!UMLUtils.isLeafComponentInstance(instSpec)) {
						return success;
					}
					
					// There should be exactly one Assign.from referencing the component						
					// to manage multi-core and partitioning issues					 
					EList<Assign> assignments = new BasicEList<Assign>();
					EList<Assign> compViewAssignments = new BasicEList<Assign>();
					try {
						// Assignments of components to processing units are in the Deployment View
						assignments = UMLUtils.getComponentAssignments(umlModel, Constants.DEPLOYMENT_VIEW_NAME);	
						// Assignments of components to functional partitions are in the Component View
						compViewAssignments = UMLUtils.getComponentAssignments(umlModel, Constants.COMPONENT_VIEW_NAME);						
						assignments.addAll(compViewAssignments);											
					} catch (ModelError e) {	
						errorMsg = "ERROR in Model: "+e.getMessage();
						e.printStackTrace();
					}

					// Read the deployments from the Model
					Package deplv = CHESSProfileManager.getViewByStereotype(umlModel,
							CHESSProfileManager.DEPLOYMENT_VIEW);					
					Set<Element> theDeployments = new HashSet<Element>();
					EList<Package> packList = UMLUtils.getAllResourcePlatformPackage(deplv);					
					for (Package pack: packList) {
						Element theEl = (Element)pack;
						theDeployments.add(theEl);
					}

					String instSpecName = "";
					instSpecName = instSpec.getName();

					boolean newErrMess = true;
					for (Element theDeployment: theDeployments) {
						String deploymentName = "";
						if (theDeployment instanceof NamedElement) {
							NamedElement namedEl = (NamedElement)theDeployment;
							deploymentName = namedEl.getName();
						}

						int counter = 0;
						if (theDomain.equals(Domain.AVIONICS)) {
							counter = UMLUtils.isAssigned2HowManyProcessingUnits(instSpec, theDeployment, assignments);
							// Look if Component is assigned to a Partition (this is independent w.r.t. the Deployment
							if (counter==0) {								
								counter += UMLUtils.isAssigned2HowManyPartitions(instSpec, assignments);								
							}							
						}
						else {
							counter = UMLUtils.isAssigned2HowManyProcessingUnits(instSpec, theDeployment, assignments);
						}

						if (counter!=1) {
							if (newErrMess) {
								newErrMess = false;
								errorMsg = "The ComponentImplementation instance " + instSpecName +" must be deployed on exactly one processing unit";								
								if (theDomain.equals(Domain.AVIONICS)) {
									errorMsg +=" or functional partition.";
								}	
								errorMsg +=" - Currently";
							}							
							errorMsg +=" for "+deploymentName+": "+ counter;
						}
					}
				}
			}
		}

		if (errorMsg != null){
			IStatus failure = ctx.createFailureStatus(
					instSpec,
					errorMsg
					);
			return failure;
		}

		return success;	
	}

}			
