#include "init.h"
#include <ArduinoJson.h>
#include <LittleFS.h>
#include <WiFi.h>
#include "utils.h"

namespace esp32 {
namespace init {

// WiFi 配置变量
static String wifiSSID = "";
static String wifiPassword = "";
static String backendUrl = "";

// TFT 显示器引用 (在 initSystem 中设置)
static Adafruit_ST7735* tftPtr = nullptr;
static U8G2_FOR_ADAFRUIT_GFX* u8g2Ptr = nullptr;

// 在屏幕上打印日志
void tftLog(const char* msg, uint16_t color) {
    if (tftPtr == nullptr || u8g2Ptr == nullptr)
        return;
    u8g2Ptr->setForegroundColor(color);
    int16_t x = tftPtr->getCursorX();
    int16_t y = tftPtr->getCursorY();
    u8g2Ptr->setCursor(x, y);
    u8g2Ptr->print(msg);
    // 更新光标位置，准备下一行（中文字体高度约14像素）
    tftPtr->setCursor(0, y + 14);
}

// 读取并解析配置文件
bool loadSettings() {
    if (!LittleFS.begin(true)) {
        tftLog("LittleFS mount failed!", RED);
        return false;
    }
    tftLog("LittleFS mounted", GREEN);

    File file = LittleFS.open("/settings.json", "r");
    if (!file) {
        tftLog("Can't open settings", RED);
        return false;
    }
    tftLog("Settings file opened", GREEN);

    // 使用 ArduinoJson 7.x 解析
    JsonDocument doc;
    DeserializationError error = deserializeJson(doc, file);
    file.close();

    if (error) {
        tftLog("JSON parse failed!", RED);
        return false;
    }

    // 读取 WiFi 配置
    wifiSSID = doc["wifi"]["ssid"].as<String>();
    wifiPassword = doc["wifi"]["password"].as<String>();

    // 读取后端接口（可选）
    if (doc["backend"].is<JsonObject>() && doc["backend"]["url"].is<const char*>()) {
        backendUrl = doc["backend"]["url"].as<String>();
    }
    if (backendUrl.isEmpty()) {
        // 回退：保持为空或设为默认
        backendUrl = "http://nf.xn--876a.net/api/data";
    }

    tftLog("配置已加载:", GREEN);
    tftLog(("  SSID: " + wifiSSID).c_str(), WHITE);

    return true;
}

// 连接 WiFi
void connectWiFi() {
    if (wifiSSID.isEmpty()) {
        tftLog("WiFi SSID empty", RED);
        return;
    }

    tftLog(("连接 WiFi: " + wifiSSID).c_str(), WHITE);

    WiFi.mode(WIFI_STA);
    WiFi.begin(wifiSSID.c_str(), wifiPassword.c_str());

    int attempts = 0;
    int16_t x = tftPtr->getCursorX();
    int16_t y = tftPtr->getCursorY();
    while (WiFi.status() != WL_CONNECTED && attempts < 20) {
        delay(500);
        u8g2Ptr->setCursor(x + attempts * 6, y);
        u8g2Ptr->print(".");
        attempts++;
    }
    tftPtr->setCursor(0, y + 14);

    if (WiFi.status() == WL_CONNECTED) {
        tftLog("WiFi 已连接!", GREEN);
        tftLog(("IP: " + WiFi.localIP().toString()).c_str(), WHITE);
    } else {
        tftLog("WiFi 连接失败!", RED);
    }
}

// 初始化系统
void initSystem(Adafruit_ST7735& tft, U8G2_FOR_ADAFRUIT_GFX& u8g2) {
    tftPtr = &tft;
    u8g2Ptr = &u8g2;
    tft.setCursor(0, tft.getCursorY() + 14);

    tftLog("=== 欢迎使用 ESP32 ===", YELLOW);
    tftLog("微弱压力数据采集系统", YELLOW);

    tft.setCursor(0, tft.getCursorY() + 14);

    // 读取配置文件并连接 WiFi
    if (loadSettings()) {
        connectWiFi();
    }
}

// 提供后端 URL 给外部使用
const String& getBackendUrl() {
    return backendUrl;
}

}  // namespace init
}  // namespace esp32
