// Declare alle functies
// lege variabel kan nog ingevult worden
// getal is een float of int
// [] betekent array
let port;
let reader;
const decoder = new TextDecoder("utf-8");
let readibleoutput = 0;
let tempArray = [];
let humidArray = [];
let lichtArray = [];
let TempAdvies;
let HumidAdvies;
let LichtAdvies;
let VolledigAdvies;
let TempWaardes;
let LuchtVochtigsheidWaardes;
let LichtWaardes;
// Maakt het makkelijk om een if "true" te maken als een variabel zich tussen 2 waardes bevind
const between = (x, min, max) => {
    return x >= min && x <= max;
  };
  document.getElementById("temp").innerHTML = "ESP niet connected";
  document.getElementById("humid").innerHTML = "ESP niet connected";
  document.getElementById("licht").innerHTML = "ESP niet connected";
  document.getElementById("Advies").innerHTML = "ESP niet connected";

// Request a port and open a connection.
async function connect() {
    //vraag aan de browser om een serial port te selecteren
    port = await navigator.serial.requestPort();
    await port.open({ baudRate: 9600 });
    reader = port.readable.getReader();
    console.log("Port is open!");
    readLoop()
}

// Read data from serial port
async function readLoop() {
    let buffer = [];

    // loop until reader.cancel() is called
    while (true) {
        // Wait for data
        const { value, done } = await reader.read();


        for (let iByte = 0; iByte < value.length; iByte++) {
            let singleByte = value[iByte];
            //functie maken er van met boolean!!!
            if (singleByte != 10) {
                buffer.push(singleByte);
            }

            else {
                let sensorString = decoder.decode(new Uint8Array(buffer));
                let SensorValues;

                //zet alle data in een json array
                try {
                    SensorValues = JSON.parse(sensorString);
                } catch (e) {
                    console.log("json niet geparserd");
                }

                if (SensorValues) {
                // Show the received data in the console        
                    console.log(SensorValues)

                    //zet alle data in een array
                    tempArray.push(SensorValues[0])
                    humidArray.push(SensorValues[1])
                    lichtArray.push(SensorValues[2])

                }

                buffer = [];
                //             var array = sensorString.split(','),
                //             temp = array[0], humid = array[1], licht = array[2];
                //                console.log(temp);
                //                console.log(humid);
                //                console.log(licht);
                document.getElementById("temp").innerHTML = SensorValues[0];
                document.getElementById("humid").innerHTML = SensorValues[1];
                document.getElementById("licht").innerHTML = SensorValues[2];
                plotly(tempGraph, tempArray)
                plotly(humidGraph, humidArray)
                plotly(lightGraph, lichtArray)
                Advies(SensorValues[0], SensorValues[1], SensorValues[2])
                AdviesUpdate()        
            }
            // Exit the loop when done
            if (done) {
                console.log('[readLoop] DONE', done);
                reader.releaseLock();
                break;
            }
        }
    }
}

// Sluit de poort
async function disconnect() {
    await reader.cancel();
    await port.close();
    document.getElementById("temp").innerHTML = "ESP niet connected";
    document.getElementById("humid").innerHTML = "ESP niet connected";
    document.getElementById("licht").innerHTML = "ESP niet connected";
    document.getElementById("Advies").innerHTML = "ESP niet connected";  
    console.log("Port is closed!");
}
//plotly grafiek
function plotly(graph, dataArray) {
    Plotly.newPlot(graph, [{
        y: dataArray,
        mode: 'lines',
        line: { color: '#80CAF6' }
    }]);
}

//eigen library maken voor serial
function Advies(TempWaardes, LuchtVochtigsheidWaardes, LichtWaardes) {

        if (TempWaardes < 0) {
            //  document.getElementById("TempAdvies").innerHTML = "Ga naar binnen of trek een dikke jas aan. Het is vriest!";
            TempAdvies = "Ga naar binnen of trek een dikke jas aan. Het is vriest! "
        }
        if (between(TempWaardes, 0, 10)) {
            // document.getElementById("TempAdvies").innerHTML = "Het is redelijk koud, pak een jas";
            TempAdvies = "Het is redelijk koud, pak een jas. ";
        }
        if (between(TempWaardes, 10, 20)) {
            TempAdvies = "Je kan zonder jas rondlopen. Een hoodie zou perfect zijn. ";
        } 
        if (between(TempWaardes, 20, 35)) {
            TempAdvies = "Het is lekker warm je kan in een shirt rondlopen. ";
        }

        if (between(LuchtVochtigsheidWaardes, 0 , 10)) {
            HumidAdvies = "De lucht is kurkdroog. "
        }
        if (between(LuchtVochtigsheidWaardes, 10 , 50)) {
            HumidAdvies = "De lucht voelt normaal aan. "
        }
        if (between(LuchtVochtigsheidWaardes, 50 , 75)) {
            HumidAdvies = "De lucht voelt wat vochtig aan. "
        }
        if (between(LuchtVochtigsheidWaardes, 75 , 100)) {
            HumidAdvies = "De lucht voelt heel vochtig aan. "
        }

        if (between(LichtWaardes, 0, 400)) {
            LichtAdvies = "Zet het licht aan holbewoner."
        }
        if (between(LichtWaardes, 400, 1200)) {
            LichtAdvies = "Het is nog een beetje donker hier maar je kan er prima zien."
        }
        
        if (between(LichtWaardes, 1200, 3000)) {
            LichtAdvies = "Het is licht"
        }
        
        if (between(LichtWaardes, 3000, 6900)) {
            LichtAdvies = "Het is heel licht"
        }
        
        
}

function AdviesUpdate(){
    VolledigAdvies = TempAdvies + HumidAdvies + LichtAdvies;
    document.getElementById("Advies").innerHTML = VolledigAdvies;
}