#include <OneWire.h>
#include <DallasTemperature.h>

const int oneWireBus = 5;
OneWire oneWire(oneWireBus);
float measurements[600];
int numMeasurements = 0;
String input;
DallasTemperature sensors(&oneWire);

void setup() {
  Serial.begin(115200);
  sensors.begin();
}

void storeMeasurement(float measurement) {
  if (numMeasurements < 600) {
    measurements[numMeasurements] = measurement;
    numMeasurements++;
  }
}

float calculateAverage(float arr[], int length) {
  float sum = 0.0;
  for (int i = 0; i < length; i++) {
    sum += arr[i];
  }
  return sum / length;
}

void printReport() {
  float averages[60];

  for (int i = 0; i < 60; i++) {
    int startIndex = i * 10;
    int endIndex = startIndex + 10;
    averages[i] = calculateAverage(measurements + startIndex, 10);
  }

  float highest = measurements[0];
  float lowest = measurements[0];

  for (int i = 1; i < numMeasurements; i++) {
    if (measurements[i] > highest) {
      highest = measurements[i];
    }
    if (measurements[i] < lowest) {
      lowest = measurements[i];
    }
  }

  float overallAverage = calculateAverage(measurements, numMeasurements);

  Serial.println("Report");
  Serial.println("10-Minute Averages:");
  for (int i = 0; i < 60; i++) {
    Serial.print(i + 1);
    Serial.print(": ");
    Serial.println(averages[i], 2); // Specify 2 decimal places
  }
  Serial.println("Highest Value(s):");
  Serial.println(highest, 2); // Specify 2 decimal places
  Serial.println("Lowest Value(s):");
  Serial.println(lowest, 2); // Specify 2 decimal places
  Serial.println("Overall Average:");
  Serial.println(overallAverage, 2); // Specify 2 decimal places 
  Serial.println("------------------");
}

void loop() {
  if (Serial.available()) {
    input = Serial.readString();
    input.trim(); 

    if (input == "Print report") {
      printReport();
      delay(10000);
    }
  }

  sensors.requestTemperatures();
  float temperatureC = sensors.getTempCByIndex(0);
  float temperatureF = sensors.getTempFByIndex(0);
  Serial.print(temperatureC, 2); // Specify 2 decimal places 
  Serial.println("ºC");
  Serial.print(temperatureF, 2); // Specify 2 decimal places 
  Serial.println("ºF");

  storeMeasurement(temperatureC); // Store the temperature measurement in the `measurements` array
  delay(100);
}
