const table = document.getElementById('live-data');
const headerRow = document.createElement('tr');
const dataRow = document.createElement('tr');

const tableDay = document.getElementById('dataDay');
const dataBody = document.getElementById('dataDayBody');
const dataHead = document.getElementById('dataDayHead');
const headerRowDay = document.createElement('tr');
const dataRowDay = document.createElement('tr');

const device = document.getElementById('device');
const total_energy_all = document.getElementById('total_energy_all');
const total_energy = document.getElementById('total_energy');
const grid_energy = document.getElementById('grid_energy');
const pv_energy = document.getElementById('pv_energy');
const battery_chg_energy = document.getElementById('battery_chg_energy');
const battery_dhg_energy = document.getElementById('battery_dhg_energy');

const legenda = {
  datetime: { label: "Data i godzina", unit: "datetime", accuracy: "" },
  r100: { label: "Błąd", unit: "faultCodes", accuracy: "" },
  r108: { label: "Ostrzeżenie", unit: "warningCodes", accuracy: "" },
  // r186: { label: "Numer seryjny", unit: "", accuracy: "" },
  r201: { label: "Tryb pracy", unit: "operationModes", accuracy: "" },
  r202: { label: "Efektywne napięcie sieciowe", unit: "V", accuracy: "0.1" },
  r203: { label: "Częstotliwość sieciowa", unit: "Hz", accuracy: "0.01" },
  r204: { label: "Średnia moc sieciowa", unit: "W", accuracy: "1" },
  r205: { label: "Efektywne napięcie falownika", unit: "V", accuracy: "0.1" },
  r206: { label: "Efektywny prąd falownika", unit: "A", accuracy: "0.1" },
  r207: { label: "Częstotliwość falownika", unit: "Hz", accuracy: "0.01" },
  r208: { label: "Średnia moc falownika", unit: "W", accuracy: "1" },
  r209: { label: "Moc ładowania falownika", unit: "W", accuracy: "1" },
  r210: { label: "Efektywne napięcie wyjściowe", unit: "V", accuracy: "0.1" },
  r211: { label: "Efektywny prąd wyjściowy", unit: "A", accuracy: "0.1" },
  r212: { label: "Częstotliwość wyjściowa", unit: "Hz", accuracy: "0.01" },
  r213: { label: "Aktywna moc wyjściowa", unit: "W", accuracy: "1" },
  r214: { label: "Całkowita moc wyjściowa", unit: "VA", accuracy: "1" },
  r215: { label: "Średnie napięcie baterii", unit: "V", accuracy: "0.1" },
  r216: { label: "Średni prąd baterii", unit: "A", accuracy: "0.1" },
  r217: { label: "Średnia moc baterii", unit: "W", accuracy: "1" },
  r219: { label: "Średnie napięcie PV", unit: "V", accuracy: "0.1" },
  r220: { label: "Średni prąd PV", unit: "A", accuracy: "0.1" },
  r223: { label: "Średnia moc PV", unit: "W", accuracy: "1" },
  r224: { label: "Średnia moc ładowania PV", unit: "W", accuracy: "1" },
  r225: { label: "Procent obciążenia", unit: "%", accuracy: "1" },
  r226: { label: "Temperatura DCDC", unit: "°C", accuracy: "1" },
  r227: { label: "Temperatura falownika", unit: "°C", accuracy: "1" },
  r229: { label: "Stan naładowania baterii", unit: "%", accuracy: "1" },
  r232: { label: "Średni prąd baterii", unit: "A", accuracy: "0.1" },
  r233: { label: "Średni prąd ładowania falownika", unit: "A", accuracy: "0.1" },
  r234: { label: "Średni prąd ładowania PV", unit: "A", accuracy: "0.1" },
  'device': { label: "", unit: "device", accuracy: "" }
};

const operationModes = {
  0: {mode: "Włączony"},
  1: {mode: "Tryb czuwania"},
  2: {mode: "Sieć"},
  3: {mode: "Off-Grid"},
  4: {mode: "Bypass"},
  5: {mode: "Ładowanie"},
  6: {mode: "Błąd"},
  '-1': {mode: "-1"}
};

const FAULTS_SIZE = 17;
const FAULTS = [
  "Przekroczenie temperatury modułu falownika",
  "Przekroczenie temperatury modułu DCDC",
  "Przekroczenie napięcia baterii",
  "Przekroczenie temperatury modułu PV",
  "Skrócenie obwodu wyjściowego",
  "Przekroczenie napięcia falownika",
  "Przekroczenie obciążenia wyjściowego",
  "Przekroczenie napięcia szyny",
  "Przekroczenie czasu rozruchu miękkiego szyny",
  "Przekroczenie prądu PV",
  "Przekroczenie napięcia PV",
  "Przekroczenie prądu baterii",
  "Przekroczenie prądu falownika",
  "Niskie napięcie szyny",
  "Zbyt wysoka składowa stała prądu falownika",
  "Zbyt duże skrzywienie prądu wyjściowego",
  "Zbyt duże skrzywienie prądu falownika",
  "Zbyt duże skrzywienie prądu baterii",
  "Zbyt duże skrzywienie prądu PV",
  "Niskie napięcie falownika",
  "Ochrona przed ujemną mocą falownika",
  "Zgubienie głównego hosta w systemie równoległym",
  "Niezgodność sygnału synchronizacji w systemie równoległym",
  "Niezgodny typ baterii",
  "Niezgodne wersje równoległe"
];

const WARNINGS_SIZE = 17;
const WARNINGS = [
  "Rezerwa (bit 0)",
  "Nieprawidłowy kształt fali sieciowej",
  "Rezerwa (bit 2)",
  "Niskie napięcie sieciowe",
  "Zbyt wysoka częstotliwość sieciowa",
  "Zbyt niska częstotliwość sieciowa",
  "Niskie napięcie PV",
  "Zbyt wysoka temperatura",
  "Niskie napięcie baterii",
  "Brak połączenia z baterią",
  "Przeciążenie",
  "Ładowanie wyrównawcze baterii",
  "Niskie napięcie baterii",
  "Ograniczenie mocy wyjściej",
  "Zablokowany wentylator",
  "Zbyt niska energia PV do użycia",
  "Przerwana komunikacja równoległa",
  "Niespójny tryb wyjściowy systemów pojedynczych i równolegch",
  "Zbyt duża różnica napięcia baterii w systemie równoległym"
];

function getFaultValues(mask) {
  let values = "";

  if (mask) {
    for (let i = 0; i < FAULTS_SIZE; i++) {
      if (mask & (1 << i)) {
        values += FAULTS[i] + ",";
      }
    }
    if (values !== "") {
      values = values.slice(0, -1);
    }
  }

  // console.log(values);
  return values;
}

function getWarningValues(mask) {
  let values = "";

  if (mask) {
    for (let i = 0; i < WARNINGS_SIZE; i++) {
      if (mask & (1 << i)) {
        values += WARNINGS[i] + ",";
      }
    }
    if (values !== "") {
      values = values.slice(0, -1);
    }
  }
  
  // console.log(values);
  return values;
}



/* globals Chart:false */

let myChart;

const date = document.getElementById("date_picker");

let now = new Date();

let year = now.getFullYear();
let month = ("0" + (now.getMonth() + 1)).slice(-2); // Dodanie zera przed jednocyfrowymi miesiącami
let day = ("0" + now.getDate()).slice(-2); // Dodanie zera przed jednocyfrowymi dniami

date.value = `${year}-${month}-${day}`;

let r1 = "";
let text1 = "";

function fetchData(r, text) {
  r1 = r;
  text1 = text;
  // Pobranie danych z serwera PHP
  fetch(
    "api/getdata.php?data=" + r + "&date_range=" + date.value + "&key=brt6k11t"
  ) // Zmień 'pobierz_dane.php' na odpowiedni adres URL, który zwraca dane z serwera PHP
    .then((response) => response.json())
    .then((data) => {
      // Zniszczenie poprzedniego wykresu, jeśli istnieje
      if (myChart) {
        myChart.destroy();
      }

      const title = document.getElementById("title");

      title.innerHTML = text;

      const ctx = document.getElementById("myChart");

      if (data.success == "yes") {
        const datasets = [];
        let labels = [];

        // Przygotowanie danych do wykresu
        for (const element in data.data) {
          if (data.data.hasOwnProperty(element)) {
            labels = data.labels;
            const dataset = {
              label: legenda[element].label,
              data: data.data[element].values.map(value => {
                if(value==-1){
                  return 'NaN';
                }else{
                  return value * parseFloat(legenda[element].accuracy);
                }
              }),
              lineTension: 0,
              backgroundColor: "transparent",
              borderColor: getRandomColor(),
              borderWidth: 1,
              pointBackgroundColor: getRandomColor(),
              cubicInterpolationMode: 'monotone',
              tension: 0.4
            };
            datasets.push(dataset);
          }
        }

        // Stworzenie wykresu
        myChart = new Chart(ctx, {
          type: "line",
          data: {
            labels: labels,
            datasets: datasets,
          },
          options: {
            responsive: true,
            height: 800,
            plugins: {
              legend: {
                display: true,
              },
              tooltip: {
                boxPadding: 1,
              },
            },
          },
        });
      } else if (data.success == "no") {
        // document.getElementById('myChart').innerHTML = data.message;
        var canvas = document.getElementById('myChart');
        // Pobierz kontekst rysowania 2D
        var context = canvas.getContext('2d');

        // Ustaw styl tekstu
        context.font = '30px Arial';
        context.fillStyle = 'red';

        // Umieść tekst w canvas
        context.fillText(data.message, 50, 50);
      }
    })
    .catch((error) => {
      console.error("Wystąpił błąd podczas pobierania danych:", error);
    });
}

date.addEventListener("change", () => {
  fetchData(r1, text1);
  dayData();
  dataEnergy();
});

// Generowanie losowego koloru
function getRandomColor() {
  const letters = "0123456789ABCDEF";
  let color = "#";
  for (let i = 0; i < 6; i++) {
    color += letters[Math.floor(Math.random() * 16)];
  }
  return color;
}

// function liveData() {
  // Tworzenie tabeli, wierszy nagłówka i danych


// Tworzenie nagłówków kolumn
for (const key in legenda) {
  const headerCell = document.createElement('th');
  headerCell.textContent = legenda[key].label;
  headerCell.setAttribute('scope', 'row');
  const headerCellDay = document.createElement('th');
  headerCellDay.textContent = legenda[key].label;
  headerCellDay.setAttribute('scope', 'row');
  headerRow.appendChild(headerCell);
  headerRowDay.appendChild(headerCellDay);
}

// Dodawanie wiersza nagłówka do tabeli

table.appendChild(headerRow);

function updateData(data) {
  // Usuwanie zawartości wiersza danych
  dataRow.innerHTML = '';

  // Tworzenie komórek z danymi
  for (const key in data.data) {
    const dataCell = document.createElement('td');
    if (legenda[key].unit === 'faultCodes') {
      const faultValues = getFaultValues(data.data[key]);
      dataCell.textContent = faultValues;
    } else if (legenda[key].unit === 'warningCodes') {
      const warningValues = getWarningValues(data.data[key]);
      dataCell.textContent = warningValues;
    } else if (legenda[key].unit === 'operationModes') {
      const modeKey = data.data[key];
      dataCell.textContent = operationModes[modeKey].mode;
    } else if (legenda[key].unit === 'datetime') {
      dataCell.textContent = data.data[key];

    }else if (legenda[key].unit === 'device'){
      device.innerHTML = data.data[key];
    } else {
      dataCell.textContent = (data.data[key] * parseFloat(legenda[key].accuracy)).toFixed(2) + legenda[key].unit;
    }

    dataRow.appendChild(dataCell);
  }

  // Dodawanie wiersza danych do tabeli
  table.appendChild(dataRow);
}

function liveData() {
  setInterval(() => {
    dataEnergy();
    fetch('api/getlivedata.php?key=brt6k11t')
      .then(response => response.json())
      .then(data => {
        // Aktualizowanie danych w tabeli
        updateData(data);
      })
      .catch(error => {
        console.error('Wystąpił błąd podczas pobierania danych:', error);
      });
  }, 1000);
}

liveData();

function dayData(){
  r = '[datetime,r100,r108,r201,r202,r203,r204,r205,r206,r207,r208,r209,r210,r211,r212,r213,r214,r215,r216,r217,r219,r220,r223,r224,r225,r226,r227,r229,r232,r233,r234]';
  fetch("api/getdata.php?data=" + r + "&date_range=" + date.value + "&key=brt6k11t")
  .then((response) => response.json())
  .then((data) => {
    if(data.success=="no"){
      dataHead.innerHTML='';
      dataBody.innerHTML=`<h4>${data.message}</h4>`;
    }else if(data.success=="yes"){
      dataHead.appendChild(headerRowDay);
      dataBody.innerHTML='';
      // Usuwanie zawartości wiersza danych
      dataRowDay.innerHTML = '';
      // console.log(data);

      // const dataBody = document.createElement('tbody');
      // Tworzenie komórek z danymi
      for (let key=0; key<(data.data.datetime.values.length); key++) {
        const dataRow = document.createElement('tr');
      for(const element in data.data){
        // for (const key in data.data[element].values.length) {
          const dataCell = document.createElement('td');
          if(data.data[element].values[key]!=='-1'){
            if (legenda[element].unit === 'faultCodes') {
              const faultValues = getFaultValues(data.data[element].values[key]);
              dataCell.textContent = faultValues;
            } else if (legenda[element].unit === 'warningCodes') {
              const warningValues = getWarningValues(data.data[element].values[key]);
              dataCell.textContent = warningValues;
            } else if (legenda[element].unit === 'operationModes') {
              const modeKey = data.data[element].values[key];
              // console.log(modeKey);
              dataCell.textContent = operationModes[modeKey].mode;
            } else if (legenda[element].unit === 'datetime') {
              dataCell.textContent = data.data[element].values[key];
            } else {
              dataCell.textContent = (data.data[element].values[key] * parseFloat(legenda[element].accuracy)).toFixed(2) + legenda[element].unit;
            }
          }else{
            if (legenda[element].unit === 'datetime') {
              dataCell.textContent = data.data[element].values[key];
            }
          }
  
          // dataCell.textContent = data.data[element].values[key]+',';
          
          dataRow.appendChild(dataCell);
          // console.info((data.data[element].values[0] * parseFloat(legenda[element].accuracy)).toFixed(2) + legenda[element].unit);
        }

        dataBody.appendChild(dataRow);
        // tableDay.appendChild(dataBody);
      }
    }
    })
    .catch(error => {
      console.error('Wystąpił błąd podczas pobierania danych:', error);
  });
}
function dataEnergy(){
  fetch("api/getenergy.php?date_range=" + date.value + "&key=brt6k11t")
  .then((response) => response.json())
  .then((data) => {
    if(data.success=="no"){
      total_energy_all.innerHTML = "0 kWh";
      total_energy.innerHTML = "0 kWh";
      grid_energy.innerHTML = "0 kWh";
      pv_energy.innerHTML = "0 kWh";
      battery_chg_energy.innerHTML = "0 kWh";
      battery_dhg_energy.innerHTML = "0 kWh";
    }else if(data.success=="yes"){
      total_energy_all.innerHTML = `${data.total_energy_all} kWh`;
      total_energy.innerHTML = `${data.total_energy} kWh`;
      grid_energy.innerHTML = `${data.grid_energy} kWh`;
      pv_energy.innerHTML = `${data.pv_energy} kWh`;
      battery_chg_energy.innerHTML = `${data.battery_chg} kWh`;
      battery_dhg_energy.innerHTML = `${data.battery_dhg} kWh`;
    }
    })
    .catch(error => {
      console.error('Wystąpił błąd podczas pobierania danych:', error);
  });
}

dayData();
dataEnergy();