#include "arduino_base64.hpp"

#define MAX_DATA_ITEMS 10

// Przykładowa strukura na dane do wysłania
typedef struct
{
  double t;
  int a;
  float b;
  bool c;
} DataItem;

typedef struct
{
  uint16_t numOfItems;
  DataItem items[MAX_DATA_ITEMS];
} Data;

void prepareData(Data& data)
{
  data.numOfItems = 5;

  for (int i = 0; i < 5; i++)
  {
    data.items[i].t = 1.2 * i;
    data.items[i].a = i;
    data.items[i].b = 2.8 * i;
    data.items[i].c = i > 2;
  }
}

void printData(Data& data)
{
  for (int i = 0; i < MAX_DATA_ITEMS; i++)
  {
    char buff[100];
    sprintf(buff, "[%d]: t = %0.2f, a = %d, b = %0.2f, c = %d",
            i, data.items[i].t, data.items[i].a, data.items[i].b, data.items[i].c);
    Serial.println(buff);
  }
}

void setup()
{
  Serial.begin(115200);

  // Przygotowanie danych do wysłania
  Data data;
  memset(&data, 0, sizeof(data));

  prepareData(data);
  printData(data);

  // Zakodowanie danych w Base64 i "wysłanie" poprzez MQTT
  char outputEncode[base64::encodeLength(sizeof(data))];
  base64::encode((uint8_t*)&data, sizeof(data), outputEncode);
  Serial.println(outputEncode);

  // Zdekodowanie odebranych danych i ich wyświetlenie
  Data dataDecoded;
  memset(&dataDecoded, 0, sizeof(dataDecoded));
  base64::decode(outputEncode, (uint8_t*)&dataDecoded);
  printData(dataDecoded);
}

void loop()
{
  delay(1000);
}