#include <qthing.h>

#include "oled.h"
#include "oled_symbols.h"
#include "event.h"

#include "Arduino.h"
#include "SSD1306Wire.h"

SSD1306Wire display(0x3c, GPIO_NUM_5, GPIO_NUM_4);

std::string oled_log = "";

void draw_network_status(uint8_t x, uint8_t y) {
    connection_status_t wlan_status = get_wlan_connection_status();
    if (wlan_status == connected) {
        display.drawFastImage(x, y, 10, 8, wlan_connected_symbol);
    }
    else if (wlan_status == connecting) {
        display.drawFastImage(x, y, 10, 8, wlan_connecting_symbol);
    }
    else if (wlan_status == disconnected) {
        display.drawFastImage(x, y, 10, 8, wlan_disconnected_symbol);
    }
}

void draw_mqtt_status(uint8_t x, uint8_t y) {
    connection_status_t mqtt_status = get_mqtt_connection_status();
    if (mqtt_status == connected) {
        display.drawFastImage(x, y, 8, 8, mqtt_connected_symbol);
    }
    else if (mqtt_status == connecting) {
        display.drawFastImage(x, y, 8, 8, mqtt_connecting_symbol);
    }
    else if (mqtt_status == disconnected) {
        display.drawFastImage(x, y, 8, 8, mqtt_disconnected_symbol);
    }
}

void display_status() {
    uint8_t iconPosition = 128;
    iconPosition -= 10;
    draw_network_status(iconPosition, 0);
    iconPosition -= 2;
    iconPosition -= 8;
    draw_mqtt_status(iconPosition, 0);

    display.setFont(ArialMT_Plain_10);
    display.setTextAlignment(TEXT_ALIGN_LEFT);
    display.drawString(0, 10, "much wow, very secure");
    display.drawString(0, 20, oled_log.c_str());
}

void oled_task(void *pvParameters) {
    while (true) {
        display.clear();

        display_status();

        display.setFont(ArialMT_Plain_10);
        display.setTextAlignment(TEXT_ALIGN_RIGHT);
        display.drawString(0, 20, String(millis()));
        display.display();

        delay(100);
    }
}

void enable_oled() {
    set_oled_log_callback([](const std::string& message) {oled_log = message;});
    display.init();
    display.flipScreenVertically();
    display.setFont(ArialMT_Plain_10);
    xTaskCreate(&oled_task, "oled_task", 4096, NULL, 10, NULL);
}