#include <esp_now.h>
#include <WiFi.h>
#include "FS.h"
#include "SD.h"
#include "SPI.h"

#define CHANNEL 1

typedef struct struct_message {
    int16_t AccX;
    int16_t AccY;
    int16_t AccZ;
} struct_message;

// Init ESP Now with fallback
void InitESPNow() {
  WiFi.disconnect();
  if (esp_now_init() != ESP_OK) {
    ESP.restart();
  }
}

// config AP SSID
void configDeviceAP() {
  const char *SSID = "BaseStation_1";
  bool result = WiFi.softAP(SSID, "Slave_1_Password", CHANNEL, 0);
}

void setup() {

  // SD card setup
  while(!SD.begin()){
    delay(1000);
  }
  uint8_t cardType = SD.cardType();
  if(cardType == CARD_NONE){
    return;
  }
  uint64_t cardSize = SD.cardSize() / (1024 * 1024);

  //Set device in AP mode to begin with
  WiFi.mode(WIFI_AP);
  // configure device AP mode
  configDeviceAP();
  // Init ESPNow with a fallback logic
  InitESPNow();
  // Once ESPNow is successfully Init, we will register for recv CB to
  // get recv packer info.
  esp_now_register_recv_cb(OnDataRecv);
}

void appendFile(fs::FS &fs, const char * path, int16_t message){
    File file = fs.open(path, FILE_APPEND);
    if(!file){
        return;
    }
    file.println(message);
    file.close();
}

// callback when data is recv from Master
void OnDataRecv(const uint8_t *mac_addr, const uint8_t *data, int data_len) {
  struct_message incomingReadings;
  memcpy(&incomingReadings, data, sizeof(incomingReadings));
  char macStr[18];
  snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
           mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
  
  appendFile(SD, "/AccX.txt", incomingReadings.AccX);
  appendFile(SD, "/AccY.txt", incomingReadings.AccY);
  appendFile(SD, "/AccZ.txt", incomingReadings.AccZ);

}

void loop() {
  // Chill
}