/**
 * Copyright (c) 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.slg.linux.transformers.sw;

import java.util.ArrayList;
import java.util.HashMap;

import org.eclipse.app4mc.amalthea.model.IDiscreteValueDeviation;
import org.eclipse.app4mc.slg.commons.m2t.CustomObjectsStore;
import org.eclipse.app4mc.slg.config.ConfigModel;
import org.eclipse.app4mc.slg.linux.generators.LinuxTicksUtilsTranslationUnit;
import org.eclipse.app4mc.slg.linux.transformers.LinuxBaseTransformer;
import org.eclipse.app4mc.transformation.util.OutputBuffer;
import org.eclipse.xtext.xbase.lib.CollectionLiterals;

import com.google.inject.Inject;
import com.google.inject.Singleton;

@Singleton
public class LinuxTicksUtilsTransformer extends LinuxBaseTransformer {

	@Inject private OutputBuffer outputBuffer;
	@Inject private CustomObjectsStore customObjsStore;

	public LinuxTicksUtilsTranslationUnit transform(final IDiscreteValueDeviation value) {
		return this.generateIntern(value.getClass());
	}

	public LinuxTicksUtilsTranslationUnit generateIntern(final Object valueClass) {
		final ArrayList<?> key = CollectionLiterals.newArrayList(valueClass);
		final LinuxTicksUtilsTranslationUnit _result;
		synchronized (_createCache_generateIntern) {
			if (_createCache_generateIntern.containsKey(key)) {
				return _createCache_generateIntern.get(key);
			}
			ConfigModel _instance = this.customObjsStore.<ConfigModel>getInstance(ConfigModel.class);
			LinuxTicksUtilsTranslationUnit tu = new LinuxTicksUtilsTranslationUnit(
					this.outputBuffer, _instance, valueClass);
			_result = tu;
			_createCache_generateIntern.put(key, _result);
		}
		_init_generateIntern(_result, valueClass);
		return _result;
	}

	private final HashMap<ArrayList<?>, LinuxTicksUtilsTranslationUnit> _createCache_generateIntern = CollectionLiterals
			.newHashMap();

	private void _init_generateIntern(final LinuxTicksUtilsTranslationUnit it, final Object valueClass) {
	}
}
