import {Html5Qrcode} from "html5-qrcode";

import {
    ed448
} from "@noble/curves/ed448";
import {
    Buffer
} from "buffer";

function htoa(h) {
  return Uint8Array.from(Buffer.from(h,"hex"));
}

var received_items = {};
var scanner = new Html5Qrcode("reader",{});
var scanner_audio = new Audio("/beep.wav");
scanner_audio.load();

function updateItemsView() {
  var items = document.querySelector("#items");
  items.innerHTML = "";
  for (var item in received_items) {
    var li = document.createElement("li");
    li.innerHTML = "<button class=\"btn btn-primary\">"+received_items[item].item.uuid+"<span class=\"badge badge-light\">"+received_items[item].num+"</span></button>";
    items.appendChild(li);
  }
}


export async function addItemTag(form) {
  if (form.value.length == 6) {
    var response = await fetch("http://127.0.0.1:8000/tag/"+form.value);
    if (response.status == 200) {
      var tracking_item = await response.json();
      if (tracking_item.uuid in received_items) {
        received_items[tracking_item.uuid].num += 1;
      } else {
        received_items[tracking_item.uuid] = { "num":1, "item": tracking_item };
      }
      updateItemsView();
      scanner_audio.play();
      form.value = "";
    }
  }
}

async function onItemScanSuccess(item_uuid) {
  scanner_audio.play();
  await scanner.stop();
  if (item_uuid.length == 36) {
    if (item_uuid in received_items) {
      received_items[item_uuid].num += 1;
    } else {
      received_items[item_uuid] = { "num":1, "item": null };
      //FIXME: add error handling
      var response = await fetch("http://127.0.0.1:8000/item/"+item_uuid);
      if (response.status == 200) {
        var tracking_item = await response.json();
        received_items[item_uuid] = { "num":1, "item": tracking_item };
      }
    }
    updateItemsView();
  }
}

export async function scanItem() {
  scanner.start({ facingMode: "user" }, { fps: 10, qrbox: { width: 250, height: 250 } }, onItemScanSuccess);
}

export async function checkinItems() {
  for (var item in received_items) {
    console.log(item, received_items[item]);
    var response = await fetch("http://127.0.0.1:8000/checkin", {
        method: "POST",
        headers: {
            "Content-Type": "application/json",
        },
        body: JSON.stringify({
            "item_uuid": received_items[item].item.uuid,
            "storage_name": document.querySelector("#storage_select").value,
            "num": received_items[item].num
        })
    });
    var tracking_item = await response.json();
    console.log(tracking_item);
  }
}

export async function loadStorages() {
  var response = await fetch("http://127.0.0.1:8000/storages");
  var storages = await response.json();
  var select = document.querySelector("#storage_select");
  for (var i in storages) {
    console.log(storages[i]);
    var option = document.createElement("option");
    option.textContent = storages[i].name;
    option.value = storages[i].name;
    select.appendChild(option);

  }
}

async function onRecevierScanSuccess(scannedCode) {
  var [uuid,signature] = scannedCode.split("/");
  scanner_audio.play();
  await scanner.stop();

  var response = await fetch("http://127.0.0.1:8000/item/"+uuid);
  if (response.status == 200) {
    var tracking_item = await response.json();
    if (ed448.verify(htoa(signature),new TextEncoder().encode(tracking_item.uuid),htoa(tracking_item.verification))) {
      document.querySelector("#uuid").innerHTML = tracking_item.uuid;
      document.querySelector("#tag").innerHTML = tracking_item.tag;
      document.querySelector("#storage").innerHTML = tracking_item.storage;
      document.querySelector("#addressee").innerHTML = tracking_item.addressee;
      document.querySelector("#team").innerHTML = tracking_item.team;
    }
  }
}

export async function scanReceiver() {
  scanner.start({ facingMode: "user" }, { fps: 10, qrbox: { width: 250, height: 250 } }, onRecevierScanSuccess);
}