#ifndef SH_PLATFORM_ESP32_H
#define SH_PLATFORM_ESP32_H

#include <Arduino.h>

// --- WiFi / HTTP / WebServer (ESP32) ---
#include <WiFi.h>
#include <WebServer.h>
#include <WiFiClient.h>
#include <HTTPClient.h>

// --- Storage / OTA ---
#include <EEPROM.h>
#include <Update.h>

// -------------------- Common aliases --------------------
using sh_web_server_t = WebServer;

// -------------------- Platform helpers --------------------
static inline String platform_get_unique_id() {
  // Стабильный ID на базе eFuse MAC.
  // Формат: 16 hex символов (64-bit).
  uint64_t mac = ESP.getEfuseMac();

  char buf[17];
  snprintf(buf, sizeof(buf), "%016llX", (unsigned long long)mac);

  // Можно убрать ведущие нули, если хочешь как на ESP8266 (но лучше оставить фиксированную длину)
  return String(buf);
}

static inline String platform_get_mac_string() {
  uint8_t mac[6];
  WiFi.macAddress(mac);

  char buf[13];
  snprintf(buf, sizeof(buf), "%02X%02X%02X%02X%02X%02X",
           mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);

  return String(buf);
}

static inline void platform_wifi_apply_radio_tuning() {
  // На ESP32 нет WiFi.setPhyMode(WIFI_PHY_MODE_11G) из ESP8266 API.
  // Минимально полезное и безопасное:
  WiFi.setSleep(false);

  // TX power на ESP32 зависит от core/IDF и чипа.
  // Если понадобится — добавим отдельной настройкой после проверки стабильности.
}

// WiFi scan: is network secured?
static inline bool platform_wifi_is_secured(int net_idx) {
  // На ESP32 encryptionType() возвращает wifi_auth_mode_t.
  // Открытая сеть = WIFI_AUTH_OPEN.
  return (WiFi.encryptionType(net_idx) != WIFI_AUTH_OPEN);
}

// OTA: на ESP32 Update.begin(...) можно вызывать с UPDATE_SIZE_UNKNOWN
static inline size_t platform_ota_get_sketch_space() {
  return UPDATE_SIZE_UNKNOWN;
}

#endif // SH_PLATFORM_ESP32_H
