const jsonFilePath = "static/dtc_table.json";

var dtcState = {};

function processDTCNotifications(dtcArray) {
  for (var i = 0; i < dtcArray.length; i++) {
    var dtcInfo = dtcArray[i].split(",");
    var errorCode = dtcInfo[1];
    var activity = parseInt(dtcInfo[3]);

    if (dtcState[errorCode]) {
      // Überprüfen, ob sich der Zustand von "previous" auf "active" geändert hat
      if (activity !== dtcState[errorCode]) {
        dtcState[errorCode] = activity;
        if (activity === 1) showDTCNotification(errorCode);
      }
    } else {
      // DTC ist neu, Zustand speichern und Benachrichtigung anzeigen
      dtcState[errorCode] = activity;
      showDTCNotification(errorCode);
    }
  }
}

function showDTCNotification(dtctext, severity) {
  // Überprüfen, ob der Browser die Notification API unterstützt
  if ("Notification" in window) {
    // Überprüfen, ob der Benutzer bereits Berechtigungen erteilt hat
    if (Notification.permission === "granted") {
      // Benachrichtigung anzeigen
      showNotification(dtctext, severity);
    } else if (Notification.permission !== "denied") {
      // Aufforderung zur Erlaubnis einholen
      Notification.requestPermission().then(function (permission) {
        if (permission === "granted") {
          // Benachrichtigung anzeigen
          showNotification(dtctext, severity);
        } else {
          // Der Benutzer hat die Berechtigung abgelehnt oder das Dialogfeld geschlossen
          console.log("Benachrichtigungsberechtigung wurde verweigert.");
        }
      });
    } else {
      // Der Benutzer hat die Berechtigung bereits verweigert
      console.log("Benachrichtigungsberechtigung wurde bereits verweigert.");
    }
  }
}

// Funktion zum Anzeigen der Benachrichtigung
function showNotification(dtctext, severity) {
  var severityIcon;
  switch (severity) {
    case 1:
      severityIcon = "static/img/info.png";
      break;
    case 2:
      severityIcon = "static/img/warn.png";
      break;
    case 3:
      severityIcon = "static/img/critical.png";
      break;
    default:
      severityIcon = "static/img/none.png";
  }

  var options = {
    body: dtctext,
    icon: severityIcon,
  };

  var notification = new Notification("KTM Chain Oiler DTC", options);

  // Optional: Handle Click-Event
  notification.onclick = function () {
    console.log("Benachrichtigung wurde angeklickt.");
  };
}

function getDescriptionForDTCNumber(number, callback) {
  fetch(jsonFilePath)
    .then((response) => response.json())
    .then((data) => {
      const dtcList = data.dtc_table_data;
      const foundEntry = dtcList.find((entry) => entry.num === number);

      if (foundEntry) {
        const description = foundEntry.description;
        const title = foundEntry.title;
        callback(null, title, description);
      } else {
        // Wenn die Nummer nicht gefunden wurde, geben Sie einen Fehler zurück
        callback(
          `Beschreibung für Nummer ${number} nicht gefunden.`,
          null,
          null
        );
      }
    })
    .catch((error) => {
      // Im Fehlerfall geben Sie den Fehler zurück
      callback(error, null, null);
    });
}

function showDTCModal(event) {
  var dtc = parseInt(event.currentTarget.getAttribute("data-dtc"));
  var debugval = event.currentTarget.getAttribute("data-debugval");
  var modal = $("#dtcModal");

  getDescriptionForDTCNumber(dtc, function (error, title, description) {
    if (error) {
      console.error("Fehler beim Abrufen der Beschreibung:", error);
      modal.find(".modal-title").text("Fehler");
      modal
        .find(".dtc-desc")
        .text("DTC-Beschreibung konnte nicht geladen werden");
    } else {
      modal.find(".modal-title").text(title);
      modal.find(".dtc-desc").text(description);
      if (debugval > 0) {
        modal.find(".dtc-debugval").text("Debugvalue: " + debugval);
      } else {
        modal.find(".dtc-debugval").remove();
      }
    }
  });
  // Modal anzeigen
  modal.modal("show");
}

function fillDTCTable(dtcArray) {
  // Referenz auf das Tabellen-Element
  var table = document.getElementById("dtc_table");
  var tablediv = document.getElementById("dtc_container");

  // Prüfen, ob DTC vorhanden sind
  if (dtcArray.length === 0) {
    // Verstecke das Tabellen-Div, wenn keine DTC vorhanden sind
    tablediv.hidden = true;
    return;
  } else {
    // Zeige das Tabellen-Div, wenn DTC vorhanden sind
    tablediv.hidden = false;
  }

  // Tabelle leeren, bevor sie neu gefüllt wird
  table.innerHTML = "";

  // Überschriften für die Tabelle erstellen
  var headerRow = table.insertRow(0);

  // Definition der Klassen und Scopes für die Spalten
  var columnDefinitions = [
    { class: "col-6", scope: "Zeitstempel" },
    { class: "col-2", scope: "Fehlercode" },
    { class: "col-2", scope: "Schwere" },
    { class: "col-2", scope: "Aktiv" },
  ];

  for (var i = 0; i < columnDefinitions.length; i++) {
    var headerCell = headerRow.insertCell(i);
    headerCell.className = `th ${columnDefinitions[i].class}`;
    headerCell.scope = columnDefinitions[i].scope;
    headerCell.innerHTML = columnDefinitions[i].scope;
  }

  // DTC-Daten in die Tabelle einfügen
  for (var i = 0; i < dtcArray.length; i++) {
    var dtcInfo = dtcArray[i].split(",");

    var row = table.insertRow(i + 1); // +1 wegen der Überschriftenzeile

    // Zeitstempel
    var timestampCell = row.insertCell(0);
    timestampCell.innerHTML = formatTimestamp(parseInt(dtcInfo[0]));

    // Fehlercode
    var errorCodeCell = row.insertCell(1);
    errorCodeCell.innerHTML = dtcInfo[1];

    // Schwere
    var severityCell = row.insertCell(2);
    var severity = parseInt(dtcInfo[2]);

    // Schwere
    switch (severity) {
      case 1:
        severityCell.innerHTML = '<img src="static/img/info.png" alt="Info" />';
        break;
      case 2:
        severityCell.innerHTML =
          '<img src="static/img/warn.png" alt="Warnung" />';
        break;
      case 3:
        severityCell.innerHTML =
          '<img src="static/img/critical.png" alt="Kritisch" />';
        break;
      default:
        severityCell.innerHTML =
          '<img src="static/img/none.png" alt="Unbekannt" />';
    }

    row.setAttribute("data-dtc", dtcInfo[1]);
    row.setAttribute("data-debugval", dtcInfo[4]);
    row.addEventListener("click", showDTCModal);

    // Aktivität
    var activityCell = row.insertCell(3);
    activityCell.innerHTML = parseInt(dtcInfo[3]) === 1 ? "active" : "previous";
  }
}

function formatTimestamp(milliseconds) {
  const date = new Date(milliseconds);

  const days = String(date.getUTCDate() - 1).padStart(2, "0");
  const hours = String(date.getUTCHours()).padStart(2, "0");
  const minutes = String(date.getUTCMinutes()).padStart(2, "0");
  const seconds = String(date.getUTCSeconds()).padStart(2, "0");
  const millisecondsFormatted = String(date.getUTCMilliseconds()).padStart(
    3,
    "0"
  );

  return `${days}-${hours}:${minutes}:${seconds}:${millisecondsFormatted}`;
}
