#include "request_stats_store_http.hpp"

#include <memory>
#include <string_view>

#include "app.hpp"
#include "http_request.hpp"
#include "logging.hpp"
#include "async_resp.hpp"
#include "request_stats.hpp"
#include <nlohmann/json.hpp>

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
