#include "request_stats_store_http.hpp"

#include "async_resp.hpp"
#include "logging.hpp"
#include "request_stats.hpp"

#include <nlohmann/json.hpp>

#include <algorithm>
#include <charconv>
#include <string_view>

namespace managedStore
{

class RequestStatsStoreHttp
{
  public:
    RequestStatsStoreHttp() = delete;
    ~RequestStatsStoreHttp() = delete;
    RequestStatsStoreHttp(const RequestStatsStoreHttp&) = default;
    RequestStatsStoreHttp& operator=(const RequestStatsStoreHttp&) = default;
    RequestStatsStoreHttp(RequestStatsStoreHttp&&) = default;
    RequestStatsStoreHttp& operator=(RequestStatsStoreHttp&&) = default;

    static void
        requestGetStats(App& app, const crow::Request& req,
                        const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
    {
        (void)app;
        BMCWEB_LOG_STATEFUL_DEBUG
            << "=> RequestStatsStoreHttp::requestGetStats:"
            << " target: " << req.target() << " method: " << req.method()
            << " body: " << req.body();
        auto store = managedStore::RequestStatsStore::instance();

        asyncResp->res.jsonValue["store"] = store.toJson();
    }

    static void
        requestClearStats(App& app, const crow::Request& req,
                          const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
    {
        (void)app;
        BMCWEB_LOG_STATEFUL_DEBUG
            << "=> RequestStatsStoreHttp::requestClearStats"
            << " target: " << req.target() << " method: " << req.method()
            << " body: " << req.body();

        // ManagedObjectStore instance:
        managedStore::RequestStatsStore& store =
            managedStore::RequestStatsStore::instance();
        store.clear();
        asyncResp->res.jsonValue["store"] = store.toJson();
    }
};

void requestRoutesRequestStatsStore(App& app)
{
    BMCWEB_ROUTE(app, "/debug/request_stats_store")
        .methods(boost::beast::http::verb::get)(
            [&app](const crow::Request& req,
                   const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
        RequestStatsStoreHttp::requestGetStats(app, req, asyncResp);
        });

    BMCWEB_ROUTE(app, "/debug/request_stats_store/clear")
        .methods(boost::beast::http::verb::post)(
            [&app](const crow::Request& req,
                   const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
        RequestStatsStoreHttp::requestClearStats(app, req, asyncResp);
        });
}

} // namespace managedStore
