var refreshTimer = null;
var isFetching = null;
var storedEvents = new Array();
var notVisited = {};

$(window).on('load', function() {
	initilise();
	// Wait some ms to throw main function
	var delay = setTimeout(main, 100);
	resetInterval();
});

function fetchEvents() {
	return storedEvents;
}

function fetchNotVisited() {
	return notVisited;
}

function removeNotVisited(eventId) {
	if (notVisited[eventId] === true) delete notVisited[eventId];
}

function main() {

	chrome.runtime.sendMessage({text: "FETCH_EVENTS"});
	// Do not fetch if is fetching now
	if (isFetching) return;
	isFetching = true;

	var feedUrl = localStorage["ip_address"]+'/include/api.php?op=get&op2=events&return_type=json&apipass='+localStorage["api_pass"]+'&user='+localStorage["user_name"]+'&pass='+localStorage["pass"];

	req = new XMLHttpRequest();
	req.onload = handleResponse;
	req.onerror = handleError;
	req.open("GET", feedUrl, true);
	req.withCredentials = true
	req.send(null);
}

function handleError() {
	chrome.runtime.sendMessage({text: "FETCH_EVENTS_URL_ERROR"});
	isFetching = false;
}

function handleResponse() {
	var doc = req.responseText;
	if (doc=="auth error") {
		chrome.runtime.sendMessage({text: "FETCH_EVENTS_URL_ERROR"});
	} else {
		var n = doc.search("404 Not Found");
		if (n>0) {
			chrome.runtime.sendMessage({text: "FETCH_EVENTS_DATA_ERROR"});
		} else {
			getEvents(doc);
			chrome.runtime.sendMessage({text: "FETCH_EVENTS_SUCCESS"});
		}
	}
	isFetching = false;
}

function getEvents(reply){
	var fetchedEvents = parseReplyEvents(reply);

	// If there is no events requested, mark all as visited
	if (storedEvents.length == 0) {
		notVisited = {};
		storedEvents = fetchedEvents;
		return;
	}

	// Discriminate the new events
	newEvents=fetchNewEvents(fetchedEvents,storedEvents);
	var newNotVisited = {};
	var notVisitedCount = 0;
	
	// Check if popup is displayed to make some actions
	var views = chrome.extension.getViews({ type: "popup" });
	for(var k=0;k<newEvents.length;k++){
		newNotVisited[newEvents[k]['id']] = true;
		if (views.length == 0) {
			notVisitedCount++;
			displayNotification (newEvents[k])
			alertsSound(newEvents[k]);
		}
	}

	// Make that the old events marked as not visited remains with the
	// same status
	for(var k=0;k<fetchedEvents.length;k++){
		if (notVisited[fetchedEvents[k]['id']] === true) {
			newNotVisited[fetchedEvents[k]['id']] = true;
			notVisitedCount++;
		}
	}
	notVisited = newNotVisited;

	// Update the number
	localStorage["new_events"] = (views.length == 0) ? notVisitedCount : 0;
	updateBadge();

	// Store the requested events
	storedEvents = fetchedEvents;
}

function updateBadge() {
	if (localStorage["new_events"] != 0) {
		chrome.browserAction.setBadgeBackgroundColor({color:[0,200,0,255]});
		chrome.browserAction.setBadgeText({ text: localStorage["new_events"] });
	} else {
		chrome.browserAction.setBadgeText({ text: "" });
	}
}

function fetchNewEvents(A,B){
	var arrDiff = new Array();
	for(var i = 0; i < A.length; i++) {
		var id = false;
		for(var j = 0; j < B.length; j++) {
			if(A[i]['id'] == B[j]['id']) {
				id = true;
				break;
			}
		}
		if(!id) {
			arrDiff.push(A[i]);
		}
	}
	return arrDiff;
}


function parseReplyEvents (reply) {

	// Split the API response
	var data = JSON.parse(reply)
	var e_array = JSON.parse(reply).data;

	// Form a properly object
	var fetchedEvents=new Array();
	for(var i=0;i<e_array.length;i++){
		var event=e_array[i];
		fetchedEvents.push({
			'id' : event.id_evento,
			'agent_name' : event.agent_name,
			'agent' : event.id_agente,
			'date' : event.timestamp,
			'title' : event.evento,
			'module' : event.id_agentmodule,
			'type' : event.event_type,
			'source' : event.source,
			'severity' : event.criticity_name,
			'visited' : false
		});
	}
	// Return the events
	return fetchedEvents;
}

function alertsSound(pEvent){
	if(localStorage["sound_alert"]!="on"){
		return;
	}

	switch (pEvent['severity']) {
		case "Critical":
			playSound(localStorage["critical"]);
			break;
		case "Informational":
			playSound(localStorage["informational"]);
			break;
		case "Maintenance":
			playSound(localStorage["maintenance"]);
			break;
		case "Normal":
			playSound(localStorage["normal"]);
			break;
		case "Warning":
			playSound(localStorage["warning"]);
			break;
	}
}

function displayNotification (pEvent) {

	// Check if the user is okay to get some notification
	if (Notification.permission === "granted") {
		// If it's okay create a notification
		getNotification(pEvent);
	}
	
	// Otherwise, we need to ask the user for permission
	// Note, Chrome does not implement the permission static property
	// So we have to check for NOT 'denied' instead of 'default'
	else if (Notification.permission !== 'denied') {
		Notification.requestPermission(function (permission) {
			// Whatever the user answers, we make sure we store the information
			if(!('permission' in Notification)) {
				Notification.permission = permission;
			}
	
			// If the user is okay, let's create a notification
			if (permission === "granted") getNotification(pEvent);
		});
	}
}

function getNotification(pEvent){
	
	// Build the event text
	var even = pEvent['type'];
	if (pEvent['source'] != '')	even += " : " + pEvent['source'];
	even += ". Event occured at " + pEvent['date'];
	if(pEvent['module'] != 0) even += " in the module with Id "+ pEvent['module'];
	even += ".";

	var url = (pEvent['agent'] == 0)
		? localStorage["ip_address"]+"/index.php?sec=eventos&sec2=operation/events/events"
		: localStorage["ip_address"]+"/index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=" + pEvent['agent'];

	var notification = new Notification(
		pEvent['title'],
		{
			body: even,
			icon: "images/icon.png"
		}
	);

	// Add the link
	notification.onclick = function (event) {
		event.preventDefault();
		window.open(url, '_blank');
	}

	// Close notification after 10 secs
	setTimeout(function() {notification.close()}, 10000);
}

function resetInterval () {
	if (refreshTimer) clearInterval(refreshTimer);
	refreshTimer = setInterval(main, localStorage["refresh"]*1000);
}

function initilise(){

	if (isFetching == null) isFetching = false;
	if(localStorage["ip_address"]==undefined){
		localStorage["ip_address"]="http://firefly.artica.es/pandora_demo";
	}
	
	if(localStorage["api_pass"]==undefined){
		localStorage["api_pass"]="doreik0";
	}
	
	if(localStorage["user_name"]==undefined){
		localStorage["user_name"]="demo";
	}
	
	if(localStorage["pass"]==undefined){
		localStorage["pass"]="demo";
	}
	if(localStorage["critical"]==null){
		localStorage["critical"]="11";
	}
	if(localStorage["informational"]==null){
		localStorage["informational"]="1";
	}
	if(localStorage["maintenance"]==null){
		localStorage["maintenance"]="10";
	}
	if(localStorage["normal"]==null){
		localStorage["normal"]="6";
	}
	if(localStorage["warning"]==null){
		localStorage["warning"]="2";
	}
	if(localStorage["events"]==null){
		localStorage["events"]=20;
	}
	if(localStorage["refresh"]==null){
		localStorage["refresh"]="10";
	}
	if(localStorage["ip_address"]==null){
		localStorage["ip_address"]="http://firefly.artica.es/pandora_demo";
	}
	
	if(localStorage["api_pass"]==null){
		localStorage["api_pass"]="doreik0";
	}
	
	if(localStorage["user_name"]==null){
		localStorage["user_name"]="demo";
	}
	
	if(localStorage["pass"]==null){
		localStorage["pass"]="demo";
	}
	if(localStorage["sound_alert"]==null){
		localStorage["sound_alert"]="on";
	}
	if(localStorage["changed"]==null){
		localStorage["changed"]="false";
	}
	if(localStorage["new_events"]==null){
		localStorage["new_events"]=parseInt(localStorage["events"]);
	}
	if(localStorage["error"]==null) {
		localStorage["error"] = true;
	}
}