#include <WiFi.h>
#include <HTTPClient.h>
#include "mbedtls/md.h"
#include <time.h>

const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* serverName = "https://<seu-api-id>.execute-api.<região>.amazonaws.com/<stage>/button-press";
const char* secretKey = "SUA_CHAVE_SECRETA";  // Deve ser a mesma chave da Lambda

const int buttonPin = 4;   // GPIO para o botão de pânico
const int ledPin = 2;      // LED de confirmação (embutido no ESP32)
bool lastButtonState = HIGH;

// Configuração de NTP para obter a hora atual
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = -3 * 3600;  // Horário de Brasília
const int daylightOffset_sec = 0;

// Função para gerar assinatura HMAC
String generateHMAC(String payload) {
  unsigned char hmacResult[32];
  mbedtls_md_context_t ctx;
  const mbedtls_md_info_t* info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256);

  mbedtls_md_init(&ctx);
  mbedtls_md_setup(&ctx, info, 1);
  mbedtls_md_hmac_starts(&ctx, (const unsigned char*)secretKey, strlen(secretKey));
  mbedtls_md_hmac_update(&ctx, (const unsigned char*)payload.c_str(), payload.length());
  mbedtls_md_hmac_finish(&ctx, hmacResult);
  mbedtls_md_free(&ctx);

  String hmacHex = "";
  for (int i = 0; i < 32; i++) {
    if (hmacResult[i] < 16) hmacHex += "0";
    hmacHex += String(hmacResult[i], HEX);
  }
  return hmacHex;
}

// Função para obter o horário atual via NTP
String getCurrentTime() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    return "Erro ao obter horário";
  }
  char timeString[25];
  strftime(timeString, sizeof(timeString), "%Y-%m-%d %H:%M:%S", &timeinfo);
  return String(timeString);
}

void setup() {
  Serial.begin(115200);
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);

  // Conectar ao Wi-Fi
  connectToWiFi();

  // Configurar NTP
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
}

void loop() {
  bool buttonState = digitalRead(buttonPin);

  if (lastButtonState == HIGH && buttonState == LOW) {
    Serial.println("Botão de pânico pressionado!");

    String currentTime = getCurrentTime();
    String jsonPayload = "{\"device\":\"ESP32\",\"button_pressed\":true,\"timestamp\":\"" + currentTime + "\"}";
    String hmacSignature = generateHMAC(jsonPayload);

    if (WiFi.status() == WL_CONNECTED) {
      HTTPClient http;
      http.begin(serverName);
      http.addHeader("Content-Type", "application/json");
      http.addHeader("X-Signature", hmacSignature);

      int httpResponseCode = http.POST(jsonPayload);

      if (httpResponseCode > 0) {
        String response = http.getString();
        Serial.println("Resposta da AWS: " + response);
        digitalWrite(ledPin, HIGH);  // Acender LED para confirmação
        delay(1000);  // Mantém o LED aceso por 1 segundo
        digitalWrite(ledPin, LOW);
      } else {
        Serial.print("Erro na requisição: ");
        Serial.println(httpResponseCode);
      }
      http.end();
    } else {
      Serial.println("WiFi desconectado. Tentando reconectar...");
      connectToWiFi();
    }
  }

  lastButtonState = buttonState;
  delay(50);  // Debounce do botão
}

// Função para conectar/reconectar ao Wi-Fi
void connectToWiFi() {
  WiFi.begin(ssid, password);
  Serial.print("Conectando ao WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi conectado!");
}