class node {
  // Constructor to initialize the node
  constructor(nodeId) {
    this.nodeId = nodeId;
    this.temperature = 0;
    this.humidity = 0;
    this.eCO2 = 0;
    this.TVOC = 0;
    this.connected = false;
  }
  // Function to update the data
  updateData(temperature, humidity, eCO2, TVOC) {
    this.temperature = temperature;
    this.humidity = humidity;
    this.eCO2 = eCO2;
    this.TVOC = TVOC;
  }
  // Function to update the connection status
  updateConnection() {
    if (connectedNodes[this.nodeId]) {
      this.connected = true;
    } else {
      this.connected = false;
    }
  }
}

class feedbackNode extends node {
  // Constructor to initialize the feedback node
  constructor(nodeId) {
    super(nodeId);
    this.feedback = {};
    this.answers = 0;
  }
  // Function to update the feedback
  updateFeedback(feedback) {
    this.feedback = feedback;
  }
}

class liveGraph extends graph {
  // Constructor to initialize the graph
  constructor(id) {
    super(id);
    this.tempArray = [];
    this.humiArray = [];
    this.eco2Array = [];
    this.tvocArray = [];
    this.cnt = 0;
    this.nodeId = "liveGraph" + id;
  }
  // Fuction to create a graph
  makeGraph() {
    // Create a new line for temperature
    Plotly.plot(this.nodeId, [
      {
        x: this.timeArray, // Use timeArray as x values
        y: this.tempArray,
        mode: "lines",
        line: { color: "#FF0000" },
        name: "Temperature",
      },
    ]);
    // Create a new line for humidity
    Plotly.plot(this.nodeId, [
      {
        x: this.timeArray, // Use timeArray as x values
        y: this.humiArray,
        mode: "lines",
        line: { color: "#80CAF6" },
        name: "Humidity",
      },
    ]);
    // Create a new line for eCO2
    Plotly.plot(this.nodeId, [
      {
        x: this.timeArray, // Use timeArray as x values
        y: this.eco2Array,
        mode: "lines",
        line: { color: "#FFA500" },
        name: "eCO2 / 10",
      },
    ]);
    // Create a new line for TVOC
    Plotly.plot(this.nodeId, [
      {
        x: this.timeArray, // Use timeArray as x values
        y: this.tvocArray,
        mode: "lines",
        line: { color: "#000000" },
        name: "TVOC / 10",
      },
    ]);
  }

  // Function to update the graph with new values got from updateData function
  updateGraph() {
    let time = new Date();
    this.timeArray.push(new Date());

    let update = {
      x: [[this.timeArray]],
      y: [
        [this.tempArray],
        [this.humiArray],
        [this.eco2Array],
        [this.tvocArray],
      ],
    };

    let olderTime = time.setMinutes(time.getMinutes() - 1);
    let futureTime = time.setMinutes(time.getMinutes() + 1);
    let minuteView = {
      xaxis: {
        type: "date",
        range: [olderTime, futureTime],
      },
    };
    Plotly.relayout(this.nodeId, minuteView);
    if (this.cnt === 10) clearInterval(interval);
  }
  // function to get the new data for graph
  updateData(temperature, humidity, eCO2, TVOC) {
    // Update the graph
    this.tempArray.push(temperature);
    this.humiArray.push(humidity);
    this.eco2Array.push(eCO2 / 10);
    this.tvocArray.push(TVOC / 10);
  }
}

class graph {
  // Constructor to initialize the graph
  constructor(id) {
      this.nodeId = "graph" + id;
      this.timeArray = [];
  }
  // Function to create a graph
  makeGraph(amountOfGraphs, array1, array2, array3, array4) {
    for (let i = 0; i < amountOfGraphs; i++) {
      // Create a new line for temperature
      Plotly.plot(this.nodeId, [
        {
          x: this.timeArray, // Use timeArray as x values
          y: array + i,
          mode: "lines",
          line: { color: "#FF0000" },
          name: "Temperature",
        },
      ]);
    }
  }
  // Function to update the graph with new values got from updateData function
  updateGraph(array1, array2, array3, array4) {
    let time = new Date();
    this.timeArray.push(new Date());

    let update = {
      x: [[this.timeArray]],
      y: [array1, array2, array3, array4],
    };

    let olderTime = time.setMinutes(time.getMinutes() - 1);
    let futureTime = time.setMinutes(time.getMinutes() + 1);
    let minuteView = {
      xaxis: {
        type: "date",
        range: [olderTime, futureTime],
      },
    };
  }
}
