//
// Created by zoe on 11/4/22.
//

#include "Sht85.hpp"
void Sht85::setup()
{

	this->sht = SHTSensor(SHTSensor::SHT85);
	readData();
}

void Sht85::readSHT()
{
	// Read data from the initialized SHT85
	// TODO send via esp now instead of printing
	if (sht.readSample()) {
		Serial.print("T:  ");
		Serial.println(sht.getTemperature(), 2);
		Serial.print("RH: ");
		Serial.println(sht.getHumidity(), 2);
	} else {
		Serial.print("Error in readSample()\n");
	}
}

out_data_sht85 Sht85::readData()
{
	// Start the I2C bus
	Wire.begin(SDA, SCL);
	delay(100); // let serial console settle

	// initiate the SHT85 sensor
	Serial.println("");
	if (sht.init(Wire)) {
		Serial.println("SHT initialization successful");
	} else {
		Serial.println("SHT initialization failed");
	}

	// T + RH reading
	readSHT();

	delay(100);

	// end I2C to free the pins to be used by the SD card
	Wire.end();

	out_data_sht85 sht85Data;
	sht85Data.temperature = sht.getTemperature();
	sht85Data.humidity = sht.getHumidity();
	return sht85Data;
}
std::list<Message> Sht85::buildMessages()
{
	std::list<Message> messages;
	auto data = readData();
	MeasurementData temperatureMeasurementData{
	    data.temperature, {}, 0x44, measurementTypeToString.at(MeasurementType::TEMPERATURE)};
	MeasurementData humidityMeasurementData{
	    data.humidity, {}, 0x44, measurementTypeToString.at(MeasurementType::HUMIDITY)};

	messages.emplace_back(
	    Message{temperatureMeasurementData, sensorInformation, Time::getInstance().getEpochSeconds()});
	messages.emplace_back(Message{humidityMeasurementData, sensorInformation, Time::getInstance().getEpochSeconds()});

	return messages;
}
SensorInformation Sht85::getSensorInformation() const
{
	return sensorInformation;
}