#include "comm.h"


void CommunicationsController::initOta() {
    ArduinoOTA.setHostname(WIFI_SSID);
    ArduinoOTA.setPassword(WIFI_PASSWORD);
    ArduinoOTA.begin();
}

void CommunicationsController::initWifi() {
    WiFiSettings.hostname = WIFI_SSID;
    WiFiSettings.password = WIFI_PASSWORD;

    WiFiSettings.onPortalWaitLoop = []() {
        ArduinoOTA.handle();
    };

    WiFiSettings.connect();
}

void CommunicationsController::init() {
    initOta();
    initWifi();

    while (WiFi.status() != WL_CONNECTED);

    WebMonitor.begin();
    l4sServer.begin();
}

byte CommunicationsController::process(float *azimuth, float *altitude) {
    ArduinoOTA.handle();
    create_connection();

    if (l4s) {
        while (l4s.connected()) {
            handle_client();
            byte resp = parseLook4Sat(azimuth, altitude);
            ArduinoOTA.handle();

            if (resp == 1) {
                return 1;
            }
        }
    }

    return 0;
}

void CommunicationsController::handle_client() {
    l4s.flush();
    received = recv();
}

byte CommunicationsController::parseLook4Sat(float* azimuth, float* altitude) {
    String tmp = received.substring(9);
    int spaceIndex = tmp.indexOf(' ');

    if (spaceIndex != -1) {
        *azimuth = tmp.substring(0, spaceIndex).toFloat();
        *altitude = tmp.substring(spaceIndex+1).toFloat();

        return 1;
    }

    return 0;
}

void CommunicationsController::create_connection() {
    l4s = l4sServer.accept();
}

String CommunicationsController::recv() {
    String rec = "";

    while (l4s.available()) {
        rec += (char)(l4s.read());
    }

    if (rec.length() == 0) {
        rec = "Ç";
    }
    return rec;
}