#include "MyWebServer.h"


ESPWebServer *ESPStaticServer;
void webserver::printn(String str)
{
    if (serialmy != nullptr)
    {
        serialmy->print(str);
    }
}
void webserver::initme()
{

    printn("webserver begain\n");

    //  wifiMulti.addAP("IRIS", "irishk*******"); // 将需要连接的一系列WiFi ID和密码输入这里
    // wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2"); // ESP8266-NodeMCU再启动后会扫描当前网络
    // wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); // 环境查找是否有这里列出的WiFi ID。如果有
    // printn("Connecting ...");                            // 则尝试使用此处存储的密码进行连接。

    // int i = 0;
    // while (wifiMulti.run() != WL_CONNECTED) { // 尝试进行wifi连接。
    //    vTaskDelay(1000);
    //    printn("retry to connect wifi");
    // }

    // WiFi连接成功后将通过串口监视器输出连接成功信息

    printn("Connected to \n");
    printn(WiFi.SSID()); // 通过串口监视器输出连接的WiFi名称
    printn("IP address:\t");
    printn(WiFi.localIP().toString()); // 通过串口监视器输出ESP8266-NodeMCU的IP
    printn("\n");
    if (SPIFFS.begin())
    { // 启动闪存文件系统
        printn("SPIFFS Started.\n");
    }
    else
    {
        printn("SPIFFS Failed to Start.\n");
    }

    server->onNotFound(handleUserRequet); // 告知系统如何处理用户请求

    server->begin(); // 启动网站服务
    printn("HTTP server started\n");
}
webserver::webserver(HardwareSerial *serial)
{
    serialmy = serial;
    server=new ESPWebServer(80);
    ESPStaticServer=server;
    initme();
}
webserver::webserver()
{
    serialmy = nullptr;
    server=new ESPWebServer(80);
    ESPStaticServer=server;
    initme();
}

webserver::~webserver()
{
}

void webserver::handleUserRequet()
{
    // Serial.println("some one come\n");
    write_log(log_path,"some one come\n",10);
    // 获取用户请求网址信息
    String webAddress = ESPStaticServer->uri();

    // 通过handleFileRead函数处处理用户访问
    bool fileReadOK = handleFileRead(webAddress);

    // 如果在SPIFFS无法找到用户访问的资源，则回复404 (Not Found)
    if (!fileReadOK)
    {
        ESPStaticServer->send(404, "text/plain", "404 Not Found");
    }
}

bool webserver::handleFileRead(String path)
{ //处理浏览器HTTP访问

    if (path.endsWith("/"))
    {                         // 如果访问地址以"/"为结尾
        path = "/index.html"; // 则将访问地址修改为/index.html便于SPIFFS访问
    }

    String contentType = getContentType(path); // 获取文件类型

    if (SPIFFS.exists(path))
    {                                                 // 如果访问的文件可以在SPIFFS中找到
        File file = SPIFFS.open(path, "r");           // 则尝试打开该文件
        ESPStaticServer->streamFile(file, contentType); // 并且将该文件返回给浏览器
        file.close();                                 // 并且关闭文件
        return true;                                  // 返回true
    }
    return false; // 如果文件未找到，则返回false
}

// 获取文件类型
String webserver::getContentType(String filename)
{
    if (filename.endsWith(".htm"))
        return "text/html";
    else if (filename.endsWith(".html"))
        return "text/html";
    else if (filename.endsWith(".css"))
        return "text/css";
    else if (filename.endsWith(".js"))
        return "application/javascript";
    else if (filename.endsWith(".png"))
        return "image/png";
    else if (filename.endsWith(".gif"))
        return "image/gif";
    else if (filename.endsWith(".jpg"))
        return "image/jpeg";
    else if (filename.endsWith(".ico"))
        return "image/x-icon";
    else if (filename.endsWith(".xml"))
        return "text/xml";
    else if (filename.endsWith(".pdf"))
        return "application/x-pdf";
    else if (filename.endsWith(".zip"))
        return "application/x-zip";
    else if (filename.endsWith(".gz"))
        return "application/x-gzip";
    return "text/plain";
}

void webserver::loop()
{
    ESPStaticServer->handleClient();
   // printn("...");
}
