#ifndef THIRD_PARTY_GBMCWEB_INCLUDE_MANAGED_STORE_HTTP_H_
#define THIRD_PARTY_GBMCWEB_INCLUDE_MANAGED_STORE_HTTP_H_

#include <memory>

#include "app.hpp"
#include "http_request.hpp"
#include "async_resp.hpp"

namespace managedStore {

class ManagedObjectStoreHttp {
 public:
  // static only class, extension/friend to ManagedObjectStore
  ManagedObjectStoreHttp() = delete;
  ~ManagedObjectStoreHttp() = delete;
  ManagedObjectStoreHttp(const ManagedObjectStoreHttp&) = default;
  ManagedObjectStoreHttp& operator=(const ManagedObjectStoreHttp&) = default;
  ManagedObjectStoreHttp(ManagedObjectStoreHttp&&) = default;
  ManagedObjectStoreHttp& operator=(ManagedObjectStoreHttp&&) = default;

  static void requestRoutesManagedStoreDebug(
      const crow::Request& req,
      const std::shared_ptr<bmcweb::AsyncResp>& asyncResp);

  static void requestRoutesManagedStorePostFlush(
      const crow::Request& req,
      const std::shared_ptr<bmcweb::AsyncResp>& asyncResp);

  static void requestRoutesSubscriptionsDebug(
      const crow::Request& req,
      const std::shared_ptr<bmcweb::AsyncResp>& asyncResp);

  static void requestRoutesEventStoreDebug(
      const crow::Request& req,
      const std::shared_ptr<bmcweb::AsyncResp>& asyncResp);

  static void requestRoutesEventStoreFlush(
      const crow::Request& req,
      const std::shared_ptr<bmcweb::AsyncResp>& asyncResp);

  static void requestGetGoogleManagedObjectStoreMetrics(
      App& app, const crow::Request& req,
      const std::shared_ptr<bmcweb::AsyncResp>& asyncResp);

  static void requestGetGoogleTimetrace(
      App& app, const crow::Request& req,
      const std::shared_ptr<bmcweb::AsyncResp>& asyncResp);

  static void handleGoogleTimetraceClearPost(
      App& app, const crow::Request& req,
      const std::shared_ptr<bmcweb::AsyncResp>& asyncResp);

  static void handleGoogleTakeSnapShot(
      App& app, const crow::Request& req,
      const std::shared_ptr<bmcweb::AsyncResp>& asyncResp);

  static void handleGoogleLoadSnapShot(
      App& app, const crow::Request& req,
      const std::shared_ptr<bmcweb::AsyncResp>& asyncResp);
};

void requestRoutesManagedStore(App& app);

};  // namespace managedStore

#endif  // THIRD_PARTY_GBMCWEB_INCLUDE_MANAGED_STORE_HTTP_H_
