#include "esphome.h"
#include <map>
#define LOCAL_LOG_LEVEL LOG_LEVEL_VERBOSE
#include "GfSun2000.h"

GfSun2000 GF = GfSun2000();




/*
typedef void (*Gtil2Sensor);
typedef void (*GfSun2000OnError) (int errorId, char* errorMessage);
*/
class Gtil2Sensor : public PollingComponent {
public:

  Sensor *ac_voltage_sensor = new Sensor();
  Sensor *dc_voltage_sensor = new Sensor();
  Sensor *avg_power_sensor = new Sensor();
  Sensor *total_energy_sensor = new Sensor();

  GfSun2000 GF;

  Gtil2Sensor() : PollingComponent(10000) {
    GF = GfSun2000();
  }

  static void dataHandler(GfSun2000Data data, void *p) {
    ESP_LOGD("Gtil2Sensor", "Data handler");
    ESP_LOGD("Gtil2Sensor", "AC Voltage   : %.1f\tV", data.ACVoltage);
    ESP_LOGD("Gtil2Sensor", "DC Voltage   : %.1f\tV", data.DCVoltage);
    ESP_LOGD("Gtil2Sensor", "Output Power : %.1f\tW", data.averagePower);
    ESP_LOGD("Gtil2Sensor", "Total Energy : %.1f\tkW/h", data.totalEnergyCounter);

    ((Gtil2Sensor*)p)->ac_voltage_sensor->publish_state(data.ACVoltage);
    ((Gtil2Sensor*)p)->dc_voltage_sensor->publish_state(data.DCVoltage);
    ((Gtil2Sensor*)p)->avg_power_sensor->publish_state(data.averagePower);
    ((Gtil2Sensor*)p)->total_energy_sensor->publish_state(data.totalEnergyCounter);

  }

  static void errorHandler(int errorId, char* errorMessage) {
    ESP_LOGD("Gtil2Sensor", "Error response: %02X - %s\n", errorId, errorMessage);
 }

  void setup() override {
    ESP_LOGD("Gtil2Sensor", "Setup");

    GF.setup(Serial2);
    GF.setDataHandler(&Gtil2Sensor::dataHandler);
    GF.setErrorHandler(&Gtil2Sensor::errorHandler);
    GF.setParent(this);
    
  }

  void setDH(GfSun2000OnData handler) {
    GF.setDataHandler(handler);
  }

  void update() override {
    ESP_LOGD("Gtil2Sensor", "Req data ...");
    GF.readData();
  }





};