#include <InfluxDbClient.h> // from bib manager

#include "config_user.h"

#if INFLUXDB_VERSION == 1


Influxdb _influxdb(INFLUXDB_HOST, INFLUXDB_PORT);

void influxdb_begin() {
  // Init variables to influxdb config - doesn't talk to database
  _influxdb.opendb(INFLUXDB_DB, INFLUXDB_USER, INFLUXDB_PASS);
}

void pushToInfluxDB(String device, float sensorValues[]) {
  uint8_t tries = 0;
  boolean addComma = false;

  String msg = "weather,device=" + device + " ";
  if (!(isnan(sensorValues[SENSOR_TEMPERATURE])))
  {
    msg += "temperature=" + String(sensorValues[SENSOR_TEMPERATURE]);
    addComma = true;
  }
  if (!(isnan(sensorValues[SENSOR_HUMIDITY])))
  {
    if (true == addComma)
      msg += ",";
    msg += "humidity=" + String(sensorValues[SENSOR_HUMIDITY]);
    addComma = true;
  }
  if (!(isnan(sensorValues[SENSOR_LIGHT])))
  {
    if (true == addComma)
      msg += ",";
    msg += "light=" + String(sensorValues[SENSOR_LIGHT]);
    addComma = true;
  }
  if (!(isnan(sensorValues[SENSOR_WINDSPEED])))
  {
    if (true == addComma)
      msg += ",";
    msg += "windspeed=" + String(sensorValues[SENSOR_WINDSPEED]);
    addComma = true;
  }
  if (!(isnan(sensorValues[SENSOR_PRESSURE])))
  {
    if (true == addComma)
      msg += ",";
    msg += "pressure=" + String(sensorValues[SENSOR_PRESSURE]);
    addComma = true;
  }
  if (!(isnan(sensorValues[SENSOR_BAT_VOLTAGE])))
  {
    if (true == addComma)
      msg += ",";
    msg += "batvoltage=" + String(sensorValues[SENSOR_BAT_VOLTAGE]);
    addComma = true;
  }
  if (!(isnan(sensorValues[SENSOR_ESAVEMODE])))
  {
    if (true == addComma)
      msg += ",";
    msg += "esavemode=" + String(sensorValues[SENSOR_ESAVEMODE]);
    addComma = true;
  }
  if (!(isnan(sensorValues[SENSOR_BATCHARGESTATE])))
  {
    if (true == addComma)
      msg += ",";
    msg += "batchargestate=" + String(sensorValues[SENSOR_BATCHARGESTATE]);
    addComma = true;
  }

  debug(msg);

  do {
    tries++;
    _influxdb.write(msg);
  } while (_influxdb.response() != DB_SUCCESS and tries < 5);
}

#elif INFLUXDB_VERSION == 2

// Data point
Point sensor(DEVICE_NAME);

// Init variables to influxdb config - doesn't talk to database
InfluxDBClient client(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN);

void influxdb_begin() {

  // Check server connection
  if (client.validateConnection()) {
    // success
#ifdef DEBUG
    Serial.print("InfluxDB connect success\n");
#endif
  } else {
    // fail
#ifdef DEBUG
    Serial.print("InfluxDB connect failed\n");
#endif
  }

}

void pushToInfluxDB(String device, float sensorValues[]) {

  if (!(isnan(sensorValues[SENSOR_TEMPERATURE])))
  {
    sensor.clearFields();
    sensor.addField("temperature", sensorValues[SENSOR_TEMPERATURE]);
    _writePoint();
  }
  if (!(isnan(sensorValues[SENSOR_HUMIDITY])))
  {
    sensor.clearFields();
    sensor.addField("humidity", sensorValues[SENSOR_HUMIDITY]);
    _writePoint();
  }
  if (!(isnan(sensorValues[SENSOR_LIGHT])))
  {
    sensor.clearFields();
    sensor.addField("light", sensorValues[SENSOR_LIGHT]);
    _writePoint();
  }
  if (!(isnan(sensorValues[SENSOR_WINDSPEED])))
  {
    sensor.clearFields();
    sensor.addField("windspeed", sensorValues[SENSOR_WINDSPEED]);
    _writePoint();
  }
  if (!(isnan(sensorValues[SENSOR_PRESSURE])))
  {
    sensor.clearFields();
    sensor.addField("pressure", sensorValues[SENSOR_PRESSURE]);
    _writePoint();
  }
  if (!(isnan(sensorValues[SENSOR_BAT_VOLTAGE])))
  {
    sensor.clearFields();
    sensor.addField("batvoltage", sensorValues[SENSOR_BAT_VOLTAGE]);
    _writePoint();
  }
  if (!(isnan(sensorValues[SENSOR_ESAVEMODE])))
  {
    sensor.clearFields();
    sensor.addField("esavemode", sensorValues[SENSOR_ESAVEMODE]);
    _writePoint();
  }
  if (!(isnan(sensorValues[SENSOR_BATCHARGESTATE])))
  {
    sensor.clearFields();
    sensor.addField("batchargestate", sensorValues[SENSOR_BATCHARGESTATE]);
    _writePoint();
  }

}

void _writePoint() {

  // wait unitl ready
  do {
#ifdef DEBUG
    Serial.print("InfluxDB: waiting for write ready\n");
#endif
  } while (client.canSendRequest() == false);

  // Write point
  if (!client.writePoint(sensor)) {
#ifdef DEBUG
    Serial.print("InfluxDB write failed: ");
    Serial.println(client.getLastErrorMessage());
    Serial.print("\nErrorcode: ");
    Serial.println(client.getLastStatusCode());
    Serial.print("\n");
#endif
  } else {
#ifdef DEBUG
    Serial.print("InfluxDB write done\n");
#endif    
  }

}

#endif // influxdb version 2 check
