/*******************************************************************************
 * Copyright (c) 2014 Bosch Software Innovations GmbH and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and Eclipse Distribution License v1.0 which accompany this distribution.
 *
 * The Eclipse Public License is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * The Eclipse Distribution License is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 * Bosch Software Innovations GmbH - Please refer to git log
 *
 *******************************************************************************/
 package org.eclipse.vorto.codegen.examples.webdevice.tests.tasks

import org.eclipse.vorto.functionblock.FBFeature
import org.eclipse.vorto.functionblock.FunctionblockFactory
import org.eclipse.vorto.functionblock.FunctionblockModel
import org.eclipse.vorto.functionblock.Operation
import org.eclipse.vorto.functionblock.PrimitiveProperty
import org.eclipse.vorto.functionblock.PrimitiveType

class TestFunctionblockModelFactory {

	public static def FunctionblockModel populateFBmodelWithProperties() {
		var fbmodel = FunctionblockFactory.eINSTANCE.createFunctionblockModel();
		var fb = FunctionblockFactory.eINSTANCE.createFunctionBlock();

		fbmodel.setName("Fridge");
		fb.setDescription("Refrigerator");
		fb.setCategory("demo");
		fb.setDescription("comment");
		fb.setVendor("www.bosch.com");
		fb.setVersion("1.2.3");
		fb.getFeatures().add(createOnOperation());
		fb.getFeatures().add(createOffOperation());
		fb.getFeatures().add(createToggleOperation());
		fb.setConfiguration(createConfiguration);
		fb.setStatus(createStatus);
		fb.setFault(createFault);
		fbmodel.setFunctionblock(fb);

		return fbmodel;
	}
	
	public static def FunctionblockModel populateFBmodel() {
		var fbmodel = FunctionblockFactory.eINSTANCE.createFunctionblockModel();
		var fb = FunctionblockFactory.eINSTANCE.createFunctionBlock();

		fbmodel.setName("Fridge");
		fb.setDescription("Refrigerator");
		fb.setCategory("demo");
		fb.setDescription("comment");
		fb.setVendor("www.bosch.com");
		fb.setVersion("1.2.3");
		fb.getFeatures().add(createOnOperation());
		fb.getFeatures().add(createOffOperation());
		fb.getFeatures().add(createToggleOperation());

		fbmodel.setFunctionblock(fb);

		return fbmodel;
	}

	private static def Operation createOnOperation() {
		var operation = FunctionblockFactory.eINSTANCE.createOperation();
		operation.setMethodName("on");
		operation.setDescription("Turn device on");
		return operation;
	}

	private static def Operation createOffOperation() {
		var operation = FunctionblockFactory.eINSTANCE.createOperation();
		operation.setMethodName("Off");
		operation.setDescription("Turn device off");
		return operation;
	}

	private static def Operation createToggleOperation() {
		var operation = FunctionblockFactory.eINSTANCE.createOperation();
		operation.setMethodName("Toggle");
		operation.setDescription("Toggle device");
		return operation;
	}

	private static def FBFeature createConfiguration() {
		var configuration = FunctionblockFactory.eINSTANCE.createFBFeature();
		configuration.properties.add(createPrimitiveProperty("testString", PrimitiveType.STRING));
		configuration.properties.add(createPrimitiveProperty("testShort", PrimitiveType.SHORT));
		configuration.properties.add(createPrimitiveProperty("testInt", PrimitiveType.INT));

		return configuration;
	}

	private static def FBFeature createStatus() {
		var status = FunctionblockFactory.eINSTANCE.createFBFeature();
		status.properties.add(createPrimitiveProperty("testString", PrimitiveType.STRING));
		status.properties.add(createPrimitiveProperty("testShort", PrimitiveType.SHORT));
		status.properties.add(createPrimitiveProperty("testInt", PrimitiveType.INT));
		status.properties.add(createPrimitiveProperty("testLong", PrimitiveType.LONG));
		status.properties.add(createPrimitiveProperty("testFloat", PrimitiveType.FLOAT));
		status.properties.add(createPrimitiveProperty("testDouble", PrimitiveType.DOUBLE));
		status.properties.add(createPrimitiveProperty("testDatetime", PrimitiveType.DATETIME));
		status.properties.add(createPrimitiveProperty("testByte", PrimitiveType.BYTE));
		status.properties.add(createPrimitiveProperty("testBase64", PrimitiveType.BASE64_BINARY));
		status.properties.add(createPrimitiveProperty("testBoolean", PrimitiveType.BOOLEAN));
		return status;
	}

	private static def FBFeature createFault() {
		var fault = FunctionblockFactory.eINSTANCE.createFBFeature();
		fault.properties.add(createPrimitiveProperty("isFault", PrimitiveType.BOOLEAN));
		return fault;
	}

	private static def PrimitiveProperty createPrimitiveProperty(String propName, PrimitiveType type) {
		var prop = FunctionblockFactory.eINSTANCE.createPrimitiveProperty();
		prop.setPropName(propName);
		prop.setType(type);
		return prop;
	}

}
