/**
 ********************************************************************************
 * Copyright (c) 2017-2020 Robert Bosch GmbH and others.
 * 
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 * 
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 *     Robert Bosch GmbH - initial API and implementation
 ********************************************************************************
 */
package org.eclipse.app4mc.sca2amalthea.exporter;

import java.util.List;

import org.eclipse.app4mc.amalthea.model.Amalthea;
import org.eclipse.app4mc.amalthea.model.AmaltheaFactory;
import org.eclipse.app4mc.amalthea.model.IAnnotatable;
import org.eclipse.app4mc.amalthea.model.OSModel;
import org.eclipse.app4mc.amalthea.model.Semaphore;
import org.eclipse.app4mc.sca.amalthea.model.utils.helper.CustomPropertiesUtil;
import org.eclipse.app4mc.sca2amalthea.exporter.locks.LockDefinition;
import org.eclipse.app4mc.sca2amalthea.exporter.locks.LockFunction;
import org.eclipse.app4mc.sca2amalthea.exporter.util.CustomPropertiesAdder;

/**
 * This class transforms an AMALHTEA OsModel. Right now only the Semaphore definition is part of this OsModel
 */
public class OsModelTransformer {

  private final TransformerDataStore dataStore;

  /**
   * Constructor
   *
   * @param dataStore
   */
  public OsModelTransformer(final TransformerDataStore dataStore) {
    super();
    this.dataStore = dataStore;
  }

  /**
   * This function creates OSModel and also initializes the global {@link #data.getSemaMap()}
   *
   * @param amaltheaModel
   * @param lockDefintion
   */
  public void transform(final Amalthea amaltheaModel, final LockDefinition lockDefintion) {
	  if(lockDefintion!=null && lockDefintion.getLockFunctions().size()!=0){
		  OSModel osModel = AmaltheaFactory.eINSTANCE.createOSModel();
		  amaltheaModel.setOsModel(osModel);
		  createSemaphoresFillMap(lockDefintion, osModel);
       }
   }

  /**
   * @param lockDefintion
   * @param osModel
   */
  private void createSemaphoresFillMap(final LockDefinition lockDefintion, final OSModel osModel) {
    List<LockFunction> lockFunctions = lockDefintion.getLockFunctions();
    for (LockFunction lockFunction : lockFunctions) {
      Semaphore semaphore = AmaltheaFactory.eINSTANCE.createSemaphore();
      semaphore.setName(lockFunction.getName());
      semaphore.setInitialValue(0);
      semaphore.setMaxValue(1);
      String getLockFunctionName = lockFunction.getGetLockFunction();
      String releaseLockFunctionName = lockFunction.getReleaseLockFunction();
      addSemaphoreFunctions(semaphore, getLockFunctionName, releaseLockFunctionName);
      CustomPropertiesUtil.addToCustomProperties(semaphore, CustomPropertiesAdder.LOCK_TYPE,
          lockFunction.getLockType().name());
      osModel.getSemaphores().add(semaphore);
      this.dataStore.getSemaMap().put(getLockFunctionName, semaphore);
      this.dataStore.getSemaMap().put(releaseLockFunctionName, semaphore);
    }
  }

  /**
   * @param amBaseObject
   * @param getLockFunctionName
   * @param releaseLockFunctionName
   */
  private void addSemaphoreFunctions(final IAnnotatable amBaseObject, final String getLockFunctionName,
      final String releaseLockFunctionName) {
    CustomPropertiesUtil.addToCustomProperties(amBaseObject, CustomPropertiesAdder.GET_LOCK_FUNC_NAME,
        getLockFunctionName);
    CustomPropertiesUtil.addToCustomProperties(amBaseObject, CustomPropertiesAdder.RELEASE_LOCK_FUNC_NAME,
        releaseLockFunctionName);
  }


}
