/**
 ********************************************************************************
 * Copyright (c) 2018-2019 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.amalthea.model.builder;

import org.eclipse.app4mc.amalthea.model.Alias;
import org.eclipse.app4mc.amalthea.model.AmaltheaFactory;
import org.eclipse.app4mc.amalthea.model.Array;
import org.eclipse.app4mc.amalthea.model.BaseTypeDefinition;
import org.eclipse.app4mc.amalthea.model.Channel;
import org.eclipse.app4mc.amalthea.model.DataTypeDefinition;
import org.eclipse.app4mc.amalthea.model.Label;
import org.eclipse.app4mc.amalthea.model.Pointer;
import org.eclipse.app4mc.amalthea.model.SWModel;
import org.eclipse.app4mc.amalthea.model.Struct;
import org.eclipse.app4mc.amalthea.model.StructEntry;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;

public class DatatypeBuilder {

	//@SuppressWarnings("java:S100") // domain specific builder language
	public void typeDefinition_BaseType(final SWModel container, final Procedure1<BaseTypeDefinition> initializer) {
		final BaseTypeDefinition obj = AmaltheaFactory.eINSTANCE.createBaseTypeDefinition();
		container.getTypeDefinitions().add(obj);
		initializer.apply(obj);
	}

	//@SuppressWarnings("java:S100") // domain specific builder language
	public void typeDefinition_DataType(final SWModel container, final Procedure1<DataTypeDefinition> initializer) {
		final DataTypeDefinition obj = AmaltheaFactory.eINSTANCE.createDataTypeDefinition();
		container.getTypeDefinitions().add(obj);
		initializer.apply(obj);
	}

	// ********** Base Types - Aliases **********

	public void alias(final BaseTypeDefinition container, final Procedure1<Alias> initializer) {
		final Alias obj = AmaltheaFactory.eINSTANCE.createAlias();
		container.getAliases().add(obj);
		initializer.apply(obj);
	}

	// ********** Data Types - Struct **********

	public void struct(final Channel container, final Procedure1<Struct> initializer) {
		final Struct obj = AmaltheaFactory.eINSTANCE.createStruct();
		container.setElementType(obj);
		initializer.apply(obj);
	}

	public void struct(final Label container, final Procedure1<Struct> initializer) {
		final Struct obj = AmaltheaFactory.eINSTANCE.createStruct();
		container.setDataType(obj);
		initializer.apply(obj);
	}

	public void struct(final DataTypeDefinition container, final Procedure1<Struct> initializer) {
		final Struct obj = AmaltheaFactory.eINSTANCE.createStruct();
		container.setDataType(obj);
		initializer.apply(obj);
	}

	public void struct(final Array container, final Procedure1<Struct> initializer) {
		final Struct obj = AmaltheaFactory.eINSTANCE.createStruct();
		container.setDataType(obj);
		initializer.apply(obj);
	}

	public void struct(final StructEntry container, final Procedure1<Struct> initializer) {
		final Struct obj = AmaltheaFactory.eINSTANCE.createStruct();
		container.setDataType(obj);
		initializer.apply(obj);
	}

	public void struct(final Pointer container, final Procedure1<Struct> initializer) {
		final Struct obj = AmaltheaFactory.eINSTANCE.createStruct();
		container.setDataType(obj);
		initializer.apply(obj);
	}

	public void entry(final Struct container, final Procedure1<StructEntry> initializer) {
		final StructEntry obj = AmaltheaFactory.eINSTANCE.createStructEntry();
		container.getEntries().add(obj);
		initializer.apply(obj);
	}

	// ********** Data Types - Array **********

	public void array(final Channel container, final Procedure1<Array> initializer) {
		final Array obj = AmaltheaFactory.eINSTANCE.createArray();
		container.setElementType(obj);
		initializer.apply(obj);
	}

	public void array(final Label container, final Procedure1<Array> initializer) {
		final Array obj = AmaltheaFactory.eINSTANCE.createArray();
		container.setDataType(obj);
		initializer.apply(obj);
	}

	public void array(final DataTypeDefinition container, final Procedure1<Array> initializer) {
		final Array obj = AmaltheaFactory.eINSTANCE.createArray();
		container.setDataType(obj);
		initializer.apply(obj);
	}

	public void array(final Array container, final Procedure1<Array> initializer) {
		final Array obj = AmaltheaFactory.eINSTANCE.createArray();
		container.setDataType(obj);
		initializer.apply(obj);
	}

	public void array(final StructEntry container, final Procedure1<Array> initializer) {
		final Array obj = AmaltheaFactory.eINSTANCE.createArray();
		container.setDataType(obj);
		initializer.apply(obj);
	}

	public void array(final Pointer container, final Procedure1<Array> initializer) {
		final Array obj = AmaltheaFactory.eINSTANCE.createArray();
		container.setDataType(obj);
		initializer.apply(obj);
	}

	// ********** Data Types - Pointer **********

	public void pointer(final Channel container, final Procedure1<Pointer> initializer) {
		final Pointer obj = AmaltheaFactory.eINSTANCE.createPointer();
		container.setElementType(obj);
		initializer.apply(obj);
	}

	public void pointer(final Label container, final Procedure1<Pointer> initializer) {
		final Pointer obj = AmaltheaFactory.eINSTANCE.createPointer();
		container.setDataType(obj);
		initializer.apply(obj);
	}

	public void pointer(final DataTypeDefinition container, final Procedure1<Pointer> initializer) {
		final Pointer obj = AmaltheaFactory.eINSTANCE.createPointer();
		container.setDataType(obj);
		initializer.apply(obj);
	}

	public void pointer(final Array container, final Procedure1<Pointer> initializer) {
		final Pointer obj = AmaltheaFactory.eINSTANCE.createPointer();
		container.setDataType(obj);
		initializer.apply(obj);
	}

	public void pointer(final StructEntry container, final Procedure1<Pointer> initializer) {
		final Pointer obj = AmaltheaFactory.eINSTANCE.createPointer();
		container.setDataType(obj);
		initializer.apply(obj);
	}

	public void pointer(final Pointer container, final Procedure1<Pointer> initializer) {
		final Pointer obj = AmaltheaFactory.eINSTANCE.createPointer();
		container.setDataType(obj);
		initializer.apply(obj);
	}

}
