#include "app_singleton.hpp"
#include "async_resp.hpp"
#include "http_request.hpp"
#include "privileges.hpp"
#include "utility.hpp"

#include <boost/beast/http/verb.hpp>

#include <array>
#include <string_view>

// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define REDFISH_HANDLER_ADD(url, verb, privileges, func)                       \
    plugins::addRedfishHandler<crow::black_magic::getParameterTag(url)>(       \
        url, verb, privileges, func)

// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define REDFISH_HANDLER_REPLACE(url, verb, func)                               \
    plugins::replaceRedfishHandler<crow::black_magic::getParameterTag(url)>(   \
        url, verb, func)

// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define REDFISH_HANDLER_REMOVE(url, verb)                                      \
    plugins::removeRedfishHandler<crow::black_magic::getParameterTag(url)>(    \
        url, verb);

// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define REDFISH_HANDLER_APPEND(url, verb, func)                                \
    plugins::appendRedfishHandler<crow::black_magic::getParameterTag(url)>(    \
        url, verb, func);

namespace plugins
{
template <uint64_t tag, typename RedfishHandler, size_t N>
void addRedfishHandler(std::string_view url, boost::beast::http::verb verb,
                       const std::array<redfish::Privileges, N>& p,
                       RedfishHandler&& func)
{
    crow::globalBmcWebApp->addHandler<tag>(url, verb, p, func);
}

template <uint64_t tag, typename RedfishHandler>
void replaceRedfishHandler(std::string_view url, boost::beast::http::verb verb,
                           RedfishHandler&& func)
{
    crow::globalBmcWebApp->replaceHandler<tag>(url, verb, func);
}

template <uint64_t tag>
void removeRedfishHandler(std::string_view url, boost::beast::http::verb verb)
{
    crow::globalBmcWebApp->removeHandler<tag>(url, verb);
}

// For a specific route, appending more than one async callbacks should be rarely
// used.
// When multiple callbacks are appended. The order is LIFO: the last appended handler
// will be executed first.
template <uint64_t tag, typename RedfishHandler>
void appendRedfishHandler(std::string_view url, boost::beast::http::verb verb,
                          RedfishHandler&& func)
{
    crow::globalBmcWebApp->appendHandler<tag>(url, verb, func);
}

} // namespace plugins