#ifndef __WEB_API_H__
#define __WEB_API_H__

#include "dbg.h"
#ifdef ESP32
    #include "AsyncTCP.h"
#else
    #include "ESPAsyncTCP.h"
#endif
#include "ESPAsyncWebServer.h"
#include "AsyncJson.h"
#include "app.h"


class app;

class webApi {
    public: 
        webApi(AsyncWebServer *srv, app *app, sysConfig_t *sysCfg, config_t *config, statistics_t *stat, char version[]);

        void setup(void);
        void loop(void);

    private:
        void onApi(AsyncWebServerRequest *request);
        void onApiPost(AsyncWebServerRequest *request);
        void onApiPostBody(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total);
        void getNotFound(JsonObject obj, String url);
        void onDwnldSetup(AsyncWebServerRequest *request);

        void getSystem(JsonObject obj);
        void getStatistics(JsonObject obj);
        void getInverterList(JsonObject obj);
        void getMqtt(JsonObject obj);
        void getNtp(JsonObject obj);
        void getPinout(JsonObject obj);
        void getRadio(JsonObject obj);
        void getSerial(JsonObject obj);


        void getIndex(JsonObject obj);
        void getSetup(JsonObject obj);
        void getLive(JsonObject obj);
        void getRecord(JsonObject obj, record_t<> *rec);

        bool setCtrl(DynamicJsonDocument jsonIn, JsonObject jsonOut);
        bool setSetup(DynamicJsonDocument jsonIn, JsonObject jsonOut);

        Inverter<> *getInverter(DynamicJsonDocument jsonIn, JsonObject jsonOut);

        double round3(double value) {
           return (int)(value * 1000 + 0.5) / 1000.0;
        }

        AsyncWebServer *mSrv;
        app *mApp;

        config_t *mConfig;
        sysConfig_t *mSysCfg;
        statistics_t *mStat;
        char *mVersion;
};

#endif /*__WEB_API_H__*/