// ESP32-C3 - SLAVE (Temp Receiver, Reply Sender) - Revised Serial Output

#include <esp_now.h>
#include <WiFi.h>
#include <esp_wifi.h> // For esp_now_recv_info_t

// MAC Address of the MASTER (ESP32-S3)
uint8_t masterMacAddress[] = {0xF0, 0x9E, 0x9E, 0x3B, 0xDF, 0xBC}; // YOUR S3 MASTER MAC

// Data structures (must match master)
typedef struct struct_temp_message {
  float temperature;
  int id;
} struct_temp_message;

typedef struct struct_reply_message {
  char status_text[20];
  int original_id;
} struct_reply_message;

struct_temp_message tempReceived;
struct_reply_message replyToSend;
esp_now_peer_info_t peerInfo;

volatile bool newTempPacketArrived = false;

// Callback when reply is sent
void OnReplySent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  // This confirms the ESP-NOW packet was queued or sent at a low level
  // Serial.print("C3_SLAVE: Low-level reply send status to S3: ");
  // Serial.println(status == ESP_NOW_SEND_SUCCESS ? "OK" : "Fail");
}

// Callback when temperature data is received
void OnTempDataRecv(const esp_now_recv_info_t *recv_info, const uint8_t *incomingData, int len) {
  if (len == sizeof(tempReceived)) {
    memcpy(&tempReceived, incomingData, sizeof(tempReceived));
    // Acknowledge temperature received
    Serial.printf("C3_SLAVE: Received Temp from S3: %.1f%cC (ID: %d)\n",
                  tempReceived.temperature, (char)223, tempReceived.id);
    newTempPacketArrived = true;
  } else {
    Serial.println("C3_SLAVE: Temp packet length mismatch.");
  }
}

void setup() {
  delay(500);
  Serial.begin(115200);
  unsigned long startWait = millis();
  while (!Serial && (millis() - startWait < 2000)) { delay(10); }

  Serial.println("\n--- C3 SLAVE Initializing ---");

  WiFi.mode(WIFI_STA);
  Serial.print("C3_SLAVE MAC: "); Serial.println(WiFi.macAddress());

  if (esp_now_init() != ESP_OK) {
    Serial.println("C3_SLAVE: ESP-NOW Init FAILED");
    while(1) delay(100);
  }
  esp_now_register_send_cb(OnReplySent);
  esp_now_register_recv_cb(OnTempDataRecv);

  memcpy(peerInfo.peer_addr, masterMacAddress, 6);
  peerInfo.channel = 0;
  peerInfo.encrypt = false;
  if (esp_now_add_peer(&peerInfo) != ESP_OK) {
    Serial.println("C3_SLAVE: Master Peer Add FAILED");
  }
  Serial.println("--- C3 SLAVE Ready ---");
}

void loop() {
  if (newTempPacketArrived) {
    newTempPacketArrived = false; 

    if (tempReceived.temperature <= 21.0) strcpy(replyToSend.status_text, "cool");
    else if (tempReceived.temperature <= 27.0) strcpy(replyToSend.status_text, "nice");
    else strcpy(replyToSend.status_text, "scorchio");
    
    replyToSend.original_id = tempReceived.id;

    // Acknowledge sending reply
    Serial.printf("C3_SLAVE: Sending Reply to S3: '%s' (for ID: %d)\n\n",
                  replyToSend.status_text, replyToSend.original_id);
                  
    esp_now_send(masterMacAddress, (uint8_t *) &replyToSend, sizeof(replyToSend));
  }
  delay(10);
}