#include "wlan.h"
#include <ArduinoJson.h>

void initial_connection(const char *ssid, const char *psk) {
  WiFi.begin(ssid, psk);
  WiFi.persistent(true);
  WiFi.setAutoConnect(true);
  WiFi.setAutoReconnect(true);
}

void connect_wlan(Config *config) {
  if (WiFi.SSID() != config->ssid)
    initial_connection(config->ssid, config->psk);
  int retries = 0;
  while (WiFi.status() != WL_CONNECTED) {
    if (retries == config->connection_attempts)
      enter_deep_sleep(true, config->sleep_time);
    retries++;
    delay(1000);
    Serial.print(".");
  }
  Serial.println("WiFi connected");
}

void connect_mqtt(PubSubClient &client, Config *config) {
  if (!client.connected())
    client.setServer(config->mqtt_host, config->mqtt_port);
  if (client.connect(config->device_id, config->mqtt_user,
                     config->mqtt_password)) {
    Serial.println("MQTT connected");
    client.subscribe(config->topic);
  }
}

void disconnect_mqtt(PubSubClient &client, const char *topic) {
  Serial.println("Disconnecting MQTT");
  client.unsubscribe(topic);
  client.disconnect();
}

size_t construct_json(float *data, char *buffer, int buffer_size) {
  StaticJsonDocument<100> json;
  json["temperature"] = data[0];
  json["humidity"] = data[1];
  json["soil_humidity"] = data[2];
  size_t payload_size = serializeJson(json, buffer, buffer_size);
  return payload_size;
}

void mqtt_transfer(PubSubClient &client, Config *config, float *data) {
  char buffer[100];
  connect_mqtt(client, config);
  size_t payload_size = construct_json(data, buffer, 100);
  client.publish(config->topic, buffer, payload_size);
  Serial.println("Data transferred successfully");
}

void enter_deep_sleep(bool wifi_timeout, int sleep_time) {
  Serial.println("Entering deep sleep");
  if (wifi_timeout)
    WiFi.disconnect();
  ESP.deepSleep(sleep_time, WAKE_RF_DEFAULT);
}
