#include <qthing.h>
#include "lcd.h"
#include "mqtt.h"

#include <string>
#include <vector>
#include <sstream>

#include "Arduino.h"
#include "LiquidCrystal.h"

LiquidCrystal lcd(-1, -1, -1, -1, -1, -1);

void enable_lcd(const std::string& topic, uint8_t rs, uint8_t en, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7) {
    lcd = LiquidCrystal(rs, en, d4, d5, d6, d7);

    lcd.begin(16, 2);
    lcd.clear();
    lcd.print("Uninitialized");

    add_wlan_connection_status_callback([](connection_status_t connection_status) {
        lcd.clear();
        if (connection_status == connecting) {
            lcd.print("WLAN connecting");
        }
        else if (connection_status == disconnected) {
            lcd.print("WLAN offline");
        }
    });

    add_mqtt_connection_status_callback([](connection_status_t connection_status) {
        lcd.clear();
        if (connection_status == connecting) {
            lcd.print("MQTT connecting");
        }
        else if (connection_status == disconnected) {
            lcd.print("MQTT offline");
        }
    });

    add_message_callback(topic, [](std::string message) {
        lcd.clear();
        std::istringstream stream(message);
        std::string line;

        std::getline(stream, line);
        lcd.setCursor(0,0);
        lcd.print(line.c_str());

        if (std::getline(stream, line)) {
            lcd.setCursor(0,1);
            lcd.print(line.c_str());
        }
    });
}