#pragma once

#include "app.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
