class MessagingService {

  async GetHyperlinkNodes(sender, callback) {
    const a = this;
    const nodes = await document.body.getElementsByTagName("a");
    let result = [];

    for (let i=0; i<nodes.length; i++) {
      result.push({
        innerText: nodes[i].innerText ?? "",
        innerHTML: a.#encodeHtml(nodes[i].innerHTML),
        href: (nodes[i].getAttribute("href") ?? "").trim(),
        title: (nodes[i].getAttribute("title") ?? "").trim(),
        target: nodes[i].getAttribute("target") ?? "",
        rel: nodes[i].getAttribute("rel") ?? "",
        type: nodes[i].getAttribute("type") ?? "",
        occurrence: 1
      });
    }

    // for (let i=0; i<result.length; i++) {
    //   result[i].occurrence = result.filter(item => JSON.stringify(item) === JSON.stringify(result[i])).length;
    // }

    await callback(result);
  }

  async GetImageNodes(sender, callback) {
    const a = this;
    const nodes = await document.body.getElementsByTagName("img");
    let result = [];

    for (let i=0; i<nodes.length; i++) {
      result.push({
        src: (nodes[i].getAttribute("src") ?? ""),
        alt: (nodes[i].getAttribute("alt") ?? ""),
        srcset: nodes[i].getAttribute("srcset") ?? "",
        usemap: nodes[i].getAttribute("usemap") ?? "",
        width: nodes[i].getAttribute("width") ?? "",
        height: nodes[i].getAttribute("height") ?? "",
        occurrence: 1
      });
    }

    await callback(result);
  }

  async GetLocation(sender, callback) {
    callback(document.location.href);
  }

  #encodeHtml(htmlContent) {
    const map = {
        "&": "&amp;",
        "<": "&lt;",
        ">": "&gt;",
        '"': "&quot;",
        "'": "&#39;",
    };

    let result = (htmlContent ?? "").replace("\r", "").replace("\n", "\\n").replace("\t", "\\t");
    result = result.replace(/[&<>"']/g, (char) => map[char]);

    return result;
  }

}


const messageService = new MessagingService();


chrome.runtime.onMessage.addListener(async function(request, sender, callback) {

  if (typeof(messageService[request.event]) == "undefined") {
    return;
  }

  await messageService[request.event](sender, callback);

});




// var optHideWatchedVideos = new Promise(function(resolve) {
//   chrome.storage.local.get(['switch1'], function(result) {
//     resolve(result.switch1);
//   });
// });
