#include <stdio.h>
#include <string.h>
#include "eventsManager.h"
#include "esp_log.h"
#include "mqtt_client.h"
#include "obtain_time.h"
#include <time.h>

EventGroupHandle_t domotic_event_group;
QueueHandle_t ihm_queue;
//extern esp_mqtt_client_handle_t client;

static const char *TAG = "evtMgr";

void startEvtManager(){
    domotic_event_group = xEventGroupCreate();
    ihm_queue = getIHMQueueHandle();

    /* Tache updateTime */
    BaseType_t ret2 = xTaskCreate(&updateTime, "updateTimeTask", 3 * 1024, NULL, 5, NULL);
    if (ret2 != pdPASS)
    {
        ESP_LOGE(TAG, "Impossiblke de creer la tache updateTimeTask %i", ret2);
    }
    /* Tache updateTime - FIN*/
}

void send_event(domo_events evt, void* pDatas) {
    ESP_LOGE(TAG,"On est dans l'event handler %i", evt);

    xIHMEvent_t *ihmEvt = malloc(sizeof(xIHMEvent_t));
    if (!ihmEvt) {
        ESP_LOGE(TAG, "malloc failed for event struct");
        return;
    }

    switch (evt) {
        case EVT_WIFI_CONNECTED: {
            xEventGroupSetBits(domotic_event_group, WIFI_CONNECTED_BIT);
            ESP_LOGI(TAG, "connected to AP SSID");

            bool *wifiStatus = malloc(sizeof(bool));
            if (!wifiStatus) {
                ESP_LOGE(TAG, "malloc failed for wifiStatus");
                free(ihmEvt);
                return;
            }
            *wifiStatus = true;

            ihmEvt->eEventType = IHM_EVT_WIFI_STATUS;
            ihmEvt->pvData = wifiStatus;
            ihmEvt->bNeedToFreeData = true;
            break;
        }

        case EVT_TIME_SETTED:
            struct tm *msg = (struct tm *)pDatas;
            struct tm *msg_copy = malloc(sizeof(struct tm));
            if (!msg_copy)
            {
                ESP_LOGE(TAG, "malloc failed for message string");
                free(ihmEvt);
                return;
            }
            // Vérifier que msg n'est pas NULL avant de copier
            if (msg == NULL)
            {
                fprintf(stderr, "msg est NULL !\n");
                free(msg_copy);
                return;
            }

            *msg_copy = *msg;
            ihmEvt->eEventType = IHM_EVT_TIME_SETTED;
            ihmEvt->pvData = msg_copy;
            ihmEvt->bNeedToFreeData = true;
            break;

        case EVT_BTN_VOLET:
            //esp_mqtt_client_publish(client, "volets", pDatas, 0, 0, 0);
            free(ihmEvt);  // rien à envoyer à l'IHM
            return;

        case EVT_PUISSANCE_RECUE:
            ESP_LOGE(TAG, "Puissance recue %i", *(int*)pDatas);
            int *data = malloc(sizeof(int));
            if (!data) {
                ESP_LOGE(TAG, "malloc failed for puissance_5mn");
                free(ihmEvt);
                return;
            }
            *data = *(int *)pDatas;
           ihmEvt->eEventType = IHM_EVT_PUISSANCE_EMISE;
            ihmEvt->pvData = data;
            ihmEvt->bNeedToFreeData = true;
            break;

        case EVT_ETAT_MACHINE:
            const char *msg2 = (const char *)pDatas;
            char *msg_copy2 = malloc(strlen(msg2) + 1);
            if (!msg_copy2) {
                ESP_LOGE(TAG, "malloc failed for message string");
                free(ihmEvt);
                return;
            }
            strcpy(msg_copy2, msg2);
            ihmEvt->eEventType = IHM_EVT_ETAT_MACHINE;
            ihmEvt->pvData = msg_copy2;
            ihmEvt->bNeedToFreeData = true;
            break;

        case EVT_HAUTEUR_CUVE: {
            float *data = malloc(sizeof(float));
            if (!data) {
                ESP_LOGE(TAG, "malloc failed for hauteur_cuve");
                free(ihmEvt);
                return;
            }
            *data = *(float *)pDatas;
            ESP_LOGE(TAG, "EVENT_HANDLER -> On a recu %f", *data);
            ihmEvt->eEventType = IHM_EVT_HAUTEUR_CUVE;
            ihmEvt->pvData = data;
            ihmEvt->bNeedToFreeData = true;
            break;
        }

        default:
            ESP_LOGE(TAG, "Unhandled event type");
            free(ihmEvt);
            return;
    }
    ESP_LOGE(TAG, "Envoi d'un evt %i a l'IHM", ihmEvt->eEventType);
    if( ihm_queue != NULL ){
        if (ihmEvt && xQueueSendToFront(ihm_queue, &ihmEvt, pdMS_TO_TICKS(10)) != pdPASS)
        {
            ESP_LOGE(TAG, "La queue est pleine");
            if (ihmEvt->bNeedToFreeData && ihmEvt->pvData)
            {
                free(ihmEvt->pvData);
            }
            free(ihmEvt);
        }
    }
}
