package com.fca.uconnect.global;


import com.amazonaws.services.iot.client.AWSIotException;
import com.amazonaws.services.iot.client.AWSIotMessage;
import com.amazonaws.services.iot.client.AWSIotMqttClient;
import com.amazonaws.services.iot.client.AWSIotQos;
import com.amazonaws.services.iot.client.AWSIotTopic;
import com.fca.uconnect.global.GlobalUconnectControl.UconnectAny;
import com.fca.uconnect.global.GlobalUconnectControl.UconnectMessage;
import com.fca.uconnect.global.GlobalUconnectExtSendAndGo.DestinationPush;
import com.fca.uconnect.global.GlobalUconnectGNSS.Address;
import com.fca.uconnect.global.GlobalUconnectGNSS.Destination;
import com.fca.uconnect.global.GlobalUconnectGNSS.Destination.RoutePreference;
import com.fca.uconnect.global.GlobalUconnectGNSS.Location;
import com.fca.uconnect.global.GlobalUconnectGNSS.PointOfInterest;
import com.google.protobuf.ByteString;
import com.google.protobuf.ExtensionRegistry;

public class SDPExampleForSendDesttoCar {
private String clientId; // The clientId is unique to the device and obtained from the client X.509 certificate CN.
private ByteString sessionId; // The sessionId is assigned by the SDP to maintain a session independent of connection protocols.
private int messageId=10; // The messageId is a sequential number incremented and assigned to each message sent from the client.
private AWSIotMqttClient mqttClient; // The mqtt client object from the AWS IoT client library. 
private AWSIotTopic iotTopic; // The Topic object to subscribe for inbound messages.
private ExtensionRegistry extRegistry; // Google protocol buffers extension registry instance.


public SDPExampleForSendDesttoCar() {
	extRegistry = ExtensionRegistry.newInstance();
	extRegistry.add(GlobalUconnectExtSendAndGo.destinationPush);
}
/**
 * This method generates a Protocol Buffer Uconnect Message given the required inputs for DestinationPush.
 * @param mapDBVariant
 * @param dest
 * @param isImmediateNavigation
 * @return
 */
public UconnectMessage getDestinationPushMsg(Destination dest,boolean isImmediateNavigation) {
	this.messageId++;
	sessionId = ByteString.copyFrom(new byte[18]);
	
	DestinationPush destPushMsg = DestinationPush.newBuilder()
			.setIsImmediateNavigation(false)
			.addDestinationList(dest)
			.build();
		
	UconnectMessage msg = UconnectMessage.newBuilder()
		.setTimestamp(System.currentTimeMillis())
		.setSessionId(sessionId)
		
		.setMessageId(messageId)
		.addMessages(UconnectAny.newBuilder().
		 setExtension(GlobalUconnectExtSendAndGo.destinationPush,destPushMsg))
		.build();
	return msg;		
}

/**
 * This method demonstrates connecting to the AWS IoT mqtt broker and publishing an SendDestinationToCar messages to the SDTC topic.
 */
public void process() {

	mqttClient = new AWSIotMqttClient("endpoint", clientId, "awsAccessKeyId", "awsSecretAccessKey");

try {			
mqttClient.connect();						
 iotTopic = new AWSIotTopic("/SDTC/#",AWSIotQos.QOS1){
	public void onMessage(AWSIotMessage msg) {
}
};
mqttClient.subscribe(iotTopic);

Location destLocation = Location.newBuilder()
.setPositionLatitude(42.480201)
.setPositionLongitude(-83.671875F)
.build();
Address address = Address.newBuilder()
.setHouseNumber("1000")
.setStreetName("Chrystler Drive")
.setCityName("Auburn Hills")
.setProvinceName("Michigan")
.setCountryName("USA")
.build();
Address poiAddress = Address.newBuilder()
.setHouseNumber("2000")
.setStreetName("abc drive")
.setCityName("Auburn Hills")
.setProvinceName("Michigan")
.setCountryName("USA")
.build();
PointOfInterest poi  = PointOfInterest.newBuilder()
.setCategory("Restaurant")
.setDescription("favorite")
.setName("ABCD Restaurant")
.setId(123)
.setPhoneNumber("123 456 7890")
.setUrl("www.abcrestaurant.com")
.build();
Destination dest = Destination.newBuilder()
.setRoutePreference(RoutePreference.Fast)
.setCreateTimestamp(System.currentTimeMillis())
.setLocation(destLocation)
.setDestinationPoi(poi)
.setDestinationAddress(address)
.build();
sendMessage(getDestinationPushMsg(dest,true));
} catch (AWSIotException e) {
	System.out.println("Caught Exception "+e);
	e.printStackTrace();
}
}


public void sendMessage(UconnectMessage msg) {
final byte[] msgOut = msg.toByteArray();
new Thread(new Runnable() {

    @Override
public void run() {
try {	
	AWSIotMessage message = new 
			MessagePublisherListener(clientId+"/SDTC/",AWSIotQos.QOS1,msgOut);
	mqttClient.publish(message);

} catch (AWSIotException e) {
	System.out.println("Caught Exception "+e);
				e.printStackTrace();
			}		    	
	    }
	}).start();
}

public static void main(String[] args) {
	SDPExampleForSendDesttoCar m = new SDPExampleForSendDesttoCar();
	m.process();
}

}
