//key is device, value = message {}
let sentValues = {};
let notificationsData = null;
let rvoName;

//sendNotification("CMD Manager: process cmd", SETTINGS.rvoTbName, "dimming_profile_was_successfully_received_by_node", { node: node }, "", SEND_TO.tb, instance);

let ERRWEIGHT = {
  EMERGENCY: "emergency", // System unusable
  ALERT: "alert",         // Action must be taken immidiately
  CRITICAL: "critical",   // Component unable to function
  ERROR: "error",         // Error, but component able to recover from it
  WARNING: "warning",     // Possibility of error, system running futher
  NOTICE: "notice",       // Significant message but not an error, things user might want to know about
  INFO: "informational",  // Info
  DEBUG: "debug"          // Debug - only if CONFIG.debug is enabled
};

function getKey(map, val) {
  return Object.keys(map).findItem(key => map[key] === val);
}

//https://stackoverflow.com/questions/41117799/string-interpolation-on-variable
var template = (tpl, args) => tpl.replace(/\${(\w+)}/g, (_, v) => args[v]);


function initNotification() {
  notificationsData = FLOW.GLOBALS.notificationsData;
  rvoName = FLOW.GLOBALS.settings.rvo_name;
}


function sendNotification(func, device, key, params, extra, tb_output, instance, saveKey) {

  let storeToSendValues = true;
  if (saveKey == undefined) storeToSendValues = false;

  let weight = "";
  let message = {};

  let notification = notificationsData[key];

  if (notification) {
    weight = notification.weight.toLowerCase();

    Object.keys(notification).forEach(item => {
      if (["en", "sk", "de", "cz", "it", "es"].includes(item)) {
        message[item] = rvoName + ": " + template(notification[item], params);
      }
    })
  }
  else {
    //console.error("sendNotification: Notifications: undefined key", key, func, notificationsData);
    console.error("sendNotification: Notifications: undefined key", key, func);
    return false;
  }

  //detect invalid err weight
  if (getKey(ERRWEIGHT, weight) == undefined) {
    console.error("sendNotification: Notifications: undefined weight", weight, key, func);
    return false;
  }

  if (sentValues.hasOwnProperty(saveKey)) {
    if (JSON.stringify(sentValues[saveKey]) == JSON.stringify(message)) {
      return false;
    }
  }

  if (sentValues[saveKey] == undefined) {
    if (storeToSendValues) {
      //do not send - flow is was started
      sentValues[saveKey] = message;
      return false;
    }
  }

  if (storeToSendValues) sentValues[saveKey] = message;

  let content = {
    "type": weight,
    "status": "new",
    "source": {
      "func": func,
      "component": instance.id,
      "component_name": instance.name,
      "edge": device
    },
    "message": message,
    "message_data": extra
  };

  let msg = {};
  msg[device] = [
    {
      "ts": Date.now(),
      "values": {
        "_event": content
      }
    }
  ];

  // Msg can be outputted from components only after configuration
  /*if (canSendErrData()){
    sendBufferedErrors();
  } else {
    bufferError(msg);
  }*/

  instance.send(tb_output, msg); // Even if error server is unavailable, send this message to output, for other possible component connections

  return true;

}

module.exports = {
  sendNotification,
  ERRWEIGHT,
  initNotification
}

