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 url =
    localStorage["ip_address"] +
    "/include/api.php?op=get&op2=events&return_type=json";
  var feedUrl = url;
  var data = new FormData();

  data.append("apipass", localStorage["api_pass"]);
  data.append("user", localStorage["user_name"]);
  data.append("pass", localStorage["pass"]);

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

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 (typeof storedEvents != "undefined" && 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;
  try {
    data = JSON.parse(reply);
  } catch (error) {
    console.log(error);
    return [];
  }
  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;
  }
}