 /**
 ********************************************************************************
 * Copyright (c) 2019-2020 Robert Bosch GmbH.
 * 
 * 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.amlt2systemc.m2t.transformers.hw

import com.google.inject.Inject
import com.google.inject.Singleton
import org.eclipse.app4mc.amalthea.model.HwFeature
import org.eclipse.app4mc.amlt2systemc.m2t.module.BaseTransformer
import org.eclipse.app4mc.amlt2systemc.m2t.transformers.TranslationUnit
import org.eclipse.app4mc.transformation.util.OutputBuffer

@Singleton
class HwFeatureTransformer extends BaseTransformer {

	@Inject OutputBuffer outputBuffer

	static def String getModulePath(HwFeature hwFeature) {
		return HwModelTransformer.getModulePath() + "/features/" + getName(hwFeature);
	}

	static def String getCall(HwFeature hwFeature) '''
	get_HwFeature_«getName(hwFeature)»()'''

	static def String getName(HwFeature hwFeature) {
		return hwFeature.containingCategory.name + "_" + hwFeature.name // or uniqueName
	}

	def create new TranslationUnit() transform(HwFeature hwFeature) {
		it.module = getModulePath(hwFeature);
		it.call = getCall(hwFeature)

		outputBuffer.appendTo("INC", it.module, toH(hwFeature))
		outputBuffer.appendTo("SRC", it.module, toCpp(hwFeature))

	}

	def String toH(HwFeature hwFeature) '''
		#include <systemc>
		#include <memory>
		#include "Common.h"
		#include "ProcessingUnitDefinition.h"
		
		HwFeature* «getCall(hwFeature)»;
	'''

	def String toCpp(HwFeature hwFeature) '''
		#include "../../../«getModulePath(hwFeature)».h"
			
		«val name = getName(hwFeature)»
		HwFeature*  «name» = nullptr;
		HwFeature* «getCall(hwFeature)»{
			if («name»==NULL){
				«name» = new HwFeature("«hwFeature.name»", «hwFeature.value.toString»);
			}
			return «name»;
		}
	'''

	def getCache() { return this._createCache_transform }
}
