/*******************************************************************************
 * Copyright (c) 2016- 2017 SENSINOV (www.sensinov.com)
 * 41 Rue de la découverte 31676 Labège - France 
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *******************************************************************************/

var bodyParser = require('body-parser');
var request = require('request');

createAE();

function createAE(){
	console.log("\n▶▶▶▶▶");
	var originator = "Cae-monitor-sync";
	var method = "POST";
	var uri= "http://127.0.0.1:8080/~/in-cse/in-name";
	var resourceType=2;
	var requestId = "123456";
	var representation = {
		"m2m:ae":{
			"rn":"mymonitor-sync",			
			"api":"app.company.com",
			"rr":"false"
		}
	};

	console.log(method+" "+uri);
	console.log(representation);

	var options = {
		uri: uri,
		method: method,
		headers: {
			"X-M2M-Origin": originator,
			"X-M2M-RI": requestId,
			"Content-Type": "application/json;ty="+resourceType
		},
		json: representation
	};

	request(options, function (error, response, body) {
		console.log("◀◀◀◀◀");
		if(error){
			console.log(error);
		}else{
			console.log(response.statusCode);
			console.log(body);
			
			setInterval(function() {
				retrieveContentInstance();
			}, 5000);
		}
	});
}


function retrieveContentInstance(){
	console.log("\n▶▶▶▶▶");
	var originator = "Cae-monitor-sync";
	var method = "GET";
	var uri= "http://127.0.0.1:8080/~/in-cse/in-name/mysensor/luminosity/la";
	var requestId = "123456";

	console.log(method+" "+uri);

	var options = {
		uri: uri,
		method: method,
		headers: {
			"X-M2M-Origin": originator,
			"X-M2M-RI": requestId,
			"Content-Type": "application/json"
		}
	};

	request(options, function (error, response, body) {
		console.log("◀◀◀◀◀");
		if(error){
			console.log(error);
		}else{
			console.log(response.statusCode);
			console.log(body);
			var jsonBody = JSON.parse(body);
			var value = jsonBody["m2m:cin"].con;
			console.log("Receieved luminosity: "+value);

			if(value>5){
				console.log("High luminosity => Switch lamp OFF");
				createContentInstance(false);
			}else{
				console.log("Low luminosity => Switch lamp ON");
				createContentInstance(true);
			}
		}
	});
}

function createContentInstance(value){
	console.log("\n▶▶▶▶▶");
	var originator = "Cae-monitor-sync";
	var method = "POST";
	var uri= "http://127.0.0.1:8080/~/in-cse/in-name/myactuator/switch";
	var resourceType=4;
	var requestId = "123456";
	var representation = {
		"m2m:cin":{
				"con": value
			}
		};

	console.log(method+" "+uri);
	console.log(representation);

	var options = {
		uri: uri,
		method: method,
		headers: {
			"X-M2M-Origin": originator,
			"X-M2M-RI": requestId,
			"Content-Type": "application/json;ty="+resourceType
		},
		json: representation
	};

	request(options, function (error, response, body) {
		console.log("◀◀◀◀◀");
		if(error){
			console.log(error);
		}else{
			console.log(response.statusCode);
			console.log(body);
		}
	});
}
