package org.eclipse.basyx.examples.snippets.aas.deployment.device;

import static org.junit.Assert.assertTrue;

import org.eclipse.basyx.aas.manager.ConnectedAssetAdministrationShellManager;
import org.eclipse.basyx.aas.metamodel.map.descriptor.ModelUrn;
import org.eclipse.basyx.aas.restapi.VABMultiSubmodelProvider;
import org.eclipse.basyx.examples.support.directory.ExampleAASRegistry;
import org.eclipse.basyx.submodel.metamodel.api.ISubModel;
import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
import org.eclipse.basyx.submodel.metamodel.map.SubModel;
import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.property.Property;
import org.eclipse.basyx.submodel.restapi.SubModelProvider;
import org.eclipse.basyx.vab.protocol.basyx.connector.BaSyxConnectorProvider;
import org.eclipse.basyx.vab.protocol.basyx.server.BaSyxTCPServer;
import org.junit.Test;

/**
 * Code snippet that illustrates the deployment of a AAS sub model to a device, and connects to that sub model
 * 
 * The AAS sub model is deployed to a dynamic BaSyxTCPServer that exports the sub model using the BaSyx TCP protocol.
 * 
 * @author kuhn
 *
 */
public class DeviceSubModelDeployment {

	
	/**
	 * Run code snippet. Connect to AAS sub model on server, access sub model properties. 
	 */
	@Test
	public void createExportAndAccessSubModel() throws Exception {

		
		// Create AAS sub model and sub model properties

		// - Create sub model
		SubModel submodel = new SubModel();
		// - Set sub model ID "SampleSM" to full qualified ID urn:de.FHG:devices.es.iese:SampleSM:1.0:3:x-509#003
		IIdentifier smId = new ModelUrn("urn:de.FHG:devices.es.iese:SampleSM:1.0:3:x-509#003");
		submodel.setIdShort("SampleSM");
		submodel.setIdentification(smId.getIdType(), smId.getId());
		// - Add example properties
		Property prop1 = new Property(7);
		prop1.setIdShort("prop1");
		submodel.addSubModelElement(prop1);

		Property prop2 = new Property("myStr");
		prop2.setIdShort("prop2");
		submodel.addSubModelElement(prop2);

		
		// Export sub model via BaSyx server
		SubModelProvider modelProvider = new SubModelProvider(submodel);
		VABMultiSubmodelProvider aasProvider = new VABMultiSubmodelProvider("SampleSM", modelProvider);
		BaSyxTCPServer<VABMultiSubmodelProvider> server = new BaSyxTCPServer<>(aasProvider, 9998);
		// - Start local BaSyx/TCP server
		server.start();
		
		
		// Create connected aas manager to connect with the dynamic server
		// We pre-register the aas endpoints to the dynamic BaSyx server
		ExampleAASRegistry registry = new ExampleAASRegistry();
		registry.addAASMapping("", ""); // No AAS is provided in this example
		registry.addSubmodelMapping("", smId.getId(), "basyx://localhost:9998/aas/submodels/SampleSM");
		
		// Create manager using the directory stub an the HTTPConnectorProvider
		ConnectedAssetAdministrationShellManager manager = new ConnectedAssetAdministrationShellManager(registry,
				// We connect via BaSyx TCP protocol
				new BaSyxConnectorProvider());
		
		// Create and connect SDK connector
		// - Retrieve sub model
		ISubModel subModel = manager.retrieveSubModel(new ModelUrn(""), smId);
		
		// Retrieve sub model values and compare to expected values
		String submodelId = subModel.getIdShort();
		String prop1Id    = subModel.getProperties().get("prop1").getIdShort();
		int prop1Val = (int) subModel.getProperties().get("prop1").getValue();
		String prop2Id    = subModel.getProperties().get("prop2").getIdShort();
		String prop2Val = (String) subModel.getProperties().get("prop2").getValue();

		
		// Compare received property values to expected values
		assertTrue(submodelId.equals("SampleSM"));
		assertTrue(prop1Id.equals("prop1"));
		assertTrue(prop1Val == 7);
		assertTrue(prop2Id.equals("prop2"));
		assertTrue(prop2Val.equals("myStr"));

	
		// Stop local BaSyx/TCP server
		server.stop();
	}
}
