package org.eclipse.basyx.regression.processengineconnector;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.util.ArrayList;
import java.util.Arrays;

import org.eclipse.basyx.aas.manager.ConnectedAssetAdministrationShellManager;
import org.eclipse.basyx.aas.metamodel.map.AssetAdministrationShell;
import org.eclipse.basyx.aas.metamodel.map.descriptor.AASDescriptor;
import org.eclipse.basyx.aas.metamodel.map.descriptor.SubmodelDescriptor;
import org.eclipse.basyx.aas.registration.api.IAASRegistryService;
import org.eclipse.basyx.aas.registration.memory.InMemoryRegistry;
import org.eclipse.basyx.aas.restapi.AASModelProvider;
import org.eclipse.basyx.aas.restapi.VABMultiSubmodelProvider;
import org.eclipse.basyx.components.processengine.connector.DeviceServiceExecutor;
import org.eclipse.basyx.regression.support.processengine.aas.DeviceAdministrationShellFactory;
import org.eclipse.basyx.regression.support.processengine.stubs.CoilcarStub;
import org.eclipse.basyx.regression.support.processengine.submodel.DeviceSubmodelFactory;
import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
import org.eclipse.basyx.submodel.metamodel.api.identifier.IdentifierType;
import org.eclipse.basyx.submodel.metamodel.map.SubModel;
import org.eclipse.basyx.submodel.metamodel.map.identifier.Identifier;
import org.eclipse.basyx.submodel.restapi.SubModelProvider;
import org.eclipse.basyx.testsuite.regression.vab.gateway.ConnectorProviderStub;
import org.junit.Before;
import org.junit.Test;

/**
 * Test the service invocation using the service executor
 * 
 * @author zhangzai
 *
 */
public class TestAASServicecall {
	/**
	 * Service Executor to be tested, used by the process engine
	 */
	private DeviceServiceExecutor serviceExecutor;
	
	/**
	 * A stub for the service sub-model 
	 */
	private CoilcarStub coilcar;
	
	/**
	 * Id of the device (coilcar) aas
	 */
	private static final String AAS_ID = "coilcar";
	
	/**
	 * Id of the service submodel
	 */
	private static final String SUBMODEL_ID = "submodel1";
	
	/**
	 * Name of the service "liftTo"
	 */
	private static final String SERVICE_LIFTTO = "liftTo";
	
	/**
	 * Name of the service "moveTo"
	 */
	private static final String SERVICE_MOVETO = "moveTo";
	
	/**
	 * Setup the test environment, create aas and submodels, setup VAB connection
	 */
	@Before
	public void setupDeviceServiceExecutor() {
		// Create a device-aas for coilcar device with id "coilcar" and submodelid "submodel1"
		AssetAdministrationShell aas = new DeviceAdministrationShellFactory().create( AAS_ID, SUBMODEL_ID);
		
		// Create service stub instead of real coilcar services
		coilcar = new CoilcarStub();
		
		// Create the submodel of services provided by the coilcar with id "submodel1"
		SubModel sm = new DeviceSubmodelFactory().create(SUBMODEL_ID, coilcar);
		
		// Create VAB multi-submodel provider for holding the sub-models
		VABMultiSubmodelProvider provider = new VABMultiSubmodelProvider();
		
		// Add sub-model to the provider
		provider.addSubmodel(new SubModelProvider(sm));
		
		// Add aas to the provider
		provider.setAssetAdministrationShell(new AASModelProvider(aas));
		
		// Create registry for aas
		IAASRegistryService registry = new InMemoryRegistry();
		
		// Create aas descriptor
		IIdentifier id = new Identifier(IdentifierType.CUSTOM, AAS_ID);
		AASDescriptor aasDescriptor = new AASDescriptor(id, "/aas");
		
		// create submodel descriptor
		IIdentifier smId = new Identifier(IdentifierType.CUSTOM, SUBMODEL_ID);
		SubmodelDescriptor smDescriptor = new SubmodelDescriptor("submodel1Name", smId, "/aas/submodels/" + SUBMODEL_ID + "/submodel");
		
		// Add submodel descriptor to aas descriptor
		aasDescriptor.addSubmodelDescriptor(smDescriptor);
		
		// register this aas
		registry.register(aasDescriptor);

		// setup the connection-manager with the model-provider
		ConnectorProviderStub connectorProvider = new ConnectorProviderStub();
		connectorProvider.addMapping("", provider);
		
		// create the service executor that calls the services using aas
		ConnectedAssetAdministrationShellManager manager = new ConnectedAssetAdministrationShellManager(registry,
				connectorProvider);
		serviceExecutor = new DeviceServiceExecutor(manager);
		
	}
	
	
	/**
	 * Test the service invocation of the service-executor 
	 */
	@Test
	public void testServicecall() {
		/* Execute the service "moveTo" on the device "coilcar", 
		 * the service is located in sub-model "submodel1" 
		 * and has a parameter 123*/
		serviceExecutor.executeService(SERVICE_MOVETO, AAS_ID, SUBMODEL_ID, new ArrayList<>(Arrays.asList( new Object[] {123})));
		
		// Validate the parameter and service name is delivered successfully to the device stub
		assertEquals(123, coilcar.getParameter());
		assertTrue(coilcar.getServiceCalled().equals(SERVICE_MOVETO));
		
		/* Execute the service "liftTo" on the device "coilcar", 
		 * the service is located in sub-model "submodel1" 
		 * and has a parameter 456*/
		serviceExecutor.executeService(SERVICE_LIFTTO, AAS_ID, SUBMODEL_ID, new ArrayList<>(Arrays.asList( new Object[] {456})));
		
		// Validate the parameter and service name is delivered successfully to the device stub
		assertEquals(456, coilcar.getParameter());
		assertTrue(coilcar.getServiceCalled().equals(SERVICE_LIFTTO));
		
		/* Execute the service "moveTo" on the device "coilcar", 
		 * the service is located in sub-model "submodel1" 
		 * and has a parameter 789*/
		serviceExecutor.executeService(SERVICE_MOVETO,  AAS_ID, SUBMODEL_ID, new ArrayList<>(Arrays.asList( new Object[] {789})));
		
		// Validate the parameter and service name is delivered successfully to the device stub
		assertEquals(789, coilcar.getParameter());
		assertTrue(coilcar.getServiceCalled().equals(SERVICE_MOVETO));
	}
}
