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

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;
}

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

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

  let lang = FLOW.GLOBALS.settings.language;
  if(lang != "en" || lang != "sk") lang = "en";

  let tpl = key;
  let weight = "";

  if(notificationsData[key])
  {
    weight = notificationsData[key].weight;
    weight = weight.toLowerCase();

    tpl = notificationsData[key][lang];
    tpl = template(tpl, 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(sentValues[saveKey] == tpl) 
    {
      return false;
    }
  }

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

  if(saveKey == "rvo_door")
  {
    //console.log("******", saveKey, sentValues[saveKey], tpl);
  }

  if(storeToSendValues) sentValues[saveKey] = tpl;

  let str = FLOW.GLOBALS.settings.rvo_name;
  if(str != "") str = str + ": ";
  str = str + tpl;

  let content = {
    "type": weight,
    "status": "new",
    "source": {
      "func":func,
      "component":instance.id,
      "component_name":instance.name,
      "edge":device
    },
    "message":str,
    "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
}
