#ifndef SH_CORE_ESP8266_H
#define SH_CORE_ESP8266_H

#define SH_CORE_PLATFORM "esp8266"

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiClient.h>
#include <ESP8266HTTPClient.h>
#include <EEPROM.h>

static const char CORE_VERSION[] PROGMEM = "esp8266 1.21 dev";

// -------------------- compile-time defaults --------------------
extern const char* DEVICE_TYPE;
extern const char* FW_VERSION;
extern const uint8_t CHANNEL_NUM;

// -------------------- EEPROM layout (ядро) --------------------
//  0..31   - SSID (макс 32 байта, включая '\0')
// 32..95   - PASS (макс 64 байта, включая '\0')
//    96    - deviceMode (1 байт)
// 97..128  - deviceName (макс 32 байта, включая '\0')
// 129..192 - authToken (макс 64 байта, включая '\0')
// 193..224 - server IP/host (макс 32 байта, включая '\0')
// 225..??? - свободно для устройств

constexpr uint16_t SSID_ADDR            = 0;
constexpr uint16_t SSID_MAX_LEN         = 32;

constexpr uint16_t PASS_ADDR            = SSID_ADDR + SSID_MAX_LEN;      // 32
constexpr uint16_t PASS_MAX_LEN         = 64;                            // 32..95

constexpr uint16_t DEVICE_MODE_ADDR     = PASS_ADDR + PASS_MAX_LEN;      // 96

constexpr uint16_t DEVICE_NAME_ADDR     = DEVICE_MODE_ADDR + 1;          // 97
constexpr uint16_t DEVICE_NAME_MAX_LEN  = 32;                            // 97..128

constexpr uint16_t AUTH_TOKEN_ADDR      = DEVICE_NAME_ADDR + DEVICE_NAME_MAX_LEN; // 129
constexpr uint16_t AUTH_TOKEN_MAX_LEN   = 64;                            // 129..192

constexpr uint16_t SERVER_ADDR          = AUTH_TOKEN_ADDR + AUTH_TOKEN_MAX_LEN;   // 193
constexpr uint16_t SERVER_MAX_LEN       = 32;                            // 193..224

// Конец блока ядра (первый свободный адрес для устройства)
constexpr uint16_t CORE_EEPROM_END      = SERVER_ADDR + SERVER_MAX_LEN; // 225

// Общий размер EEPROM
constexpr uint16_t EEPROM_SIZE          = 512;

// Диапазон EEPROM, свободный для устройств:
constexpr uint16_t DEVICE_EEPROM_START  = CORE_EEPROM_END;              // 225
constexpr uint16_t DEVICE_EEPROM_SIZE   = EEPROM_SIZE - DEVICE_EEPROM_START;

// -------------------- Device mode --------------------
enum DeviceMode : uint8_t {
  DEVICE_MODE_SETUP    = 0,
  DEVICE_MODE_NORMAL   = 1,
  DEVICE_MODE_ERROR    = 2,
  DEVICE_MODE_UPDATING = 3
};

// -------------------- Globals (ядро) --------------------
extern ESP8266WebServer server;

extern String savedSSID;
extern String savedPASS;

extern DeviceMode deviceMode;
extern String     deviceName;
extern String     serverBaseUrl;   // у тебя это хранит IP сервера
extern String     authToken;

// -------------------- pages --------------------
extern const char* wifi_setup_page;
extern const char* update_page;

// -------------------- core API --------------------
uint16_t getDeviceEepromStart();
uint16_t getDeviceEepromSize();

String readStringFromEEPROM(uint16_t addr, uint16_t maxLen);
void writeStringToEEPROM(uint16_t addr, const String &str, uint16_t maxLen);

void saveWiFiConfig(const String &ssid, const String &pass);
void loadWiFiConfig();

void loadDeviceConfig();
void saveDeviceConfig();

bool tryConnectWiFi();
void startAPMode();

String getUniqueID();
String getMAC();

void coreSetup();
void coreLoop();

// Универсальный POST JSON на serverBaseUrl (добавлено)
bool core_post_json_to_server(const String &path, const String &json_body, uint32_t timeout_ms, int &http_code_out);

// Путь для core event'ов (можно переопределить в прошивке устройства).
__attribute__((weak)) const char* core_get_event_path();

// -------------------- routes registration (реализованы в .cpp) --------------------
void registerWebUiRoutes();
void registerRestApiRoutes();

#endif // SH_CORE_ESP8266_H
