/**
 ********************************************************************************
 * Copyright (c) 2021 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.commons.m2t.transformers.sw;

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

import org.eclipse.app4mc.amalthea.model.IDiscreteValueDeviation;
import org.eclipse.app4mc.amalthea.model.ProcessingUnitDefinition;
import org.eclipse.app4mc.amalthea.model.Ticks;
import org.eclipse.app4mc.slg.commons.m2t.generators.TicksTranslationUnit;
import org.eclipse.app4mc.slg.commons.m2t.generators.TicksUtilsTranslationUnit;
import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGBaseTransformer;
import org.eclipse.app4mc.transformation.util.OutputBuffer;
import org.eclipse.emf.common.util.EMap;

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

@Singleton
public class TicksTransformer extends SLGBaseTransformer {

	@Inject private OutputBuffer outputBuffer;
	@Inject private TicksUtilsTransformer ticksUtilsTransformer;

	public TicksTranslationUnit transform(final Ticks ticks) {
		if (ticks.getDefault() != null) {
			final TicksUtilsTranslationUnit tuTicks = ticksUtilsTransformer.generate(ticks.getDefault());
			return new TicksTranslationUnit(outputBuffer, tuTicks, ticks, "default", ticks.getDefault());
		}
		return null;
	}

	public List<TicksTranslationUnit> transformAllItems(final Ticks ticks) {
		final List<TicksTranslationUnit> result = new ArrayList<TicksTranslationUnit>();
		final IDiscreteValueDeviation defaultTicks = ticks.getDefault();
		if ((defaultTicks != null)) {
			final TicksUtilsTranslationUnit tuTicks = this.ticksUtilsTransformer.generate(ticks.getDefault());
			result.add(new TicksTranslationUnit(this.outputBuffer, tuTicks, ticks,
					"default", ticks.getDefault()));
		}
		EMap<ProcessingUnitDefinition, IDiscreteValueDeviation> _extended = null;
		if (ticks != null) {
			_extended = ticks.getExtended();
		}
		final EMap<ProcessingUnitDefinition, IDiscreteValueDeviation> puExtendedMap = _extended;
		Set<ProcessingUnitDefinition> _keySet = puExtendedMap.keySet();
		for (final ProcessingUnitDefinition puDefinition : _keySet) {
			{
				final IDiscreteValueDeviation ticksValue = puExtendedMap.get(puDefinition);
				if (((puDefinition != null) && (ticksValue != null))) {
					final TicksUtilsTranslationUnit tuTicks_1 = this.ticksUtilsTransformer.generate(ticksValue);
					String _name = puDefinition.getName();
					TicksTranslationUnit _ticksTranslationUnit_1 = new TicksTranslationUnit(this.outputBuffer,
							tuTicks_1, ticks, _name, ticksValue);
					result.add(_ticksTranslationUnit_1);
				}
			}
		}
		return result;
	}

}
