/**
 * 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.commons.m2t.generators;

import java.util.Arrays;

import org.eclipse.app4mc.amalthea.model.LabelAccess;
import org.eclipse.app4mc.amalthea.model.LabelAccessEnum;
import org.eclipse.app4mc.amalthea.model.LabelAccessStatistic;
import org.eclipse.app4mc.amalthea.model.MinAvgMaxStatistic;
import org.eclipse.app4mc.amalthea.model.NumericStatistic;
import org.eclipse.app4mc.amalthea.model.SingleValueStatistic;
import org.eclipse.app4mc.transformation.util.OutputBuffer;

public class LabelAccessTranslationUnit extends TranslationUnit {
	public String getBasePath() {
		return this.tuLabel.getBasePath();
	}

	public String getModuleName() {
		return this.tuLabel.getModuleName();
	}

	public String getIncFile() {
		return this.tuLabel.getIncFile();
	}

	@Override
	public String getCall() {
		String _xblockexpression = null;
		{
			String statString = "1";
			LabelAccessStatistic _statistic = null;
			if (this.labelAccess != null) {
				_statistic = this.labelAccess.getStatistic();
			}
			NumericStatistic _value = null;
			if (_statistic != null) {
				_value = _statistic.getValue();
			}
			final NumericStatistic stat = _value;
			if ((stat != null)) {
				LabelAccessStatistic _statistic_1 = null;
				if (this.labelAccess != null) {
					_statistic_1 = this.labelAccess.getStatistic();
				}
				NumericStatistic _value_1 = null;
				if (_statistic_1 != null) {
					_value_1 = _statistic_1.getValue();
				}
				statString = LabelAccessTranslationUnit.getNumericStatistic(_value_1);
			}
			String _switchResult = null;
			LabelAccessEnum _access = this.labelAccess.getAccess();
			if (_access != null) {
				switch (_access) {
				case READ:
					_switchResult = this.tuLabel.readCall(statString);
					break;
				case WRITE:
					_switchResult = this.tuLabel.writeCall(statString);
					break;
				default:
					String _name = this.labelAccess.getData().getName();
					String _plus = ("/*underspecified access to label" + _name);
					_switchResult = (_plus + "*/");
					break;
				}
			} else {
				String _name = this.labelAccess.getData().getName();
				String _plus = ("/*underspecified access to label" + _name);
				_switchResult = (_plus + "*/");
			}
			_xblockexpression = _switchResult;
		}
		return _xblockexpression;
	}

	public String getModulePath() {
		return getBasePath() + "/" + getModuleName();
	}

	private OutputBuffer outputBuffer;

	@Override
	public String getSrcFile() {
		return getModuleName() + ".cpp";
	}

	public String getIncPath() {
		return getModulePath() + "/_inc/" + getIncFile();
	}

	public String getSrcPath() {
		return getModulePath() + "/_src/" + getSrcFile();
	}

	public boolean isIncFileEmpty() {
		return !outputBuffer.bufferExists("INC", getModulePath() + "/_inc/" + getModuleName());
	}

	public boolean isSrcFileEmpty() {
		return !outputBuffer.bufferExists("SRC", getModulePath() + "/_src/" + getModuleName());
	}

	public boolean incAppend(final String str) {
		return outputBuffer.appendTo("INC", getModulePath() + "/_inc/" + getModuleName(), str);
	}

	public boolean srcAppend(final String str) {
		return outputBuffer.appendTo("SRC", getModulePath() + "/_src/" + getModuleName(), str);
	}

	private final LabelTranslationUnit tuLabel;

	private final LabelAccess labelAccess;

	public LabelAccessTranslationUnit(final OutputBuffer outputBuffer, final LabelTranslationUnit tuLabel,
			final LabelAccess labelAccess) {
		super();
		this.tuLabel = tuLabel;
		this.labelAccess = labelAccess;
		this.outputBuffer = outputBuffer;
	}

	protected static String _getNumericStatistic(final MinAvgMaxStatistic stat) {
		String _string = Integer.valueOf(Double.valueOf(Math.ceil(stat.getAvg())).intValue()).toString();
		return (_string + "/*MinAvgMaxStatistic not supported yet*/");
	}

	protected static String _getNumericStatistic(final SingleValueStatistic stat) {
		return Integer.valueOf(Double.valueOf(Math.ceil(stat.getValue())).intValue()).toString();
	}

	public static String getNumericStatistic(final NumericStatistic stat) {
		if (stat instanceof MinAvgMaxStatistic) {
			return _getNumericStatistic((MinAvgMaxStatistic) stat);
		} else if (stat instanceof SingleValueStatistic) {
			return _getNumericStatistic((SingleValueStatistic) stat);
		} else {
			throw new IllegalArgumentException("Unhandled parameter types: " + Arrays.<Object>asList(stat).toString());
		}
	}
}
