#ifndef THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_REDFISH_APP_H_
#define THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_REDFISH_APP_H_

#include <cstdint>
#include <memory>
#include <string>
#include <string_view>
#include <vector>

#include "absl/container/flat_hash_set.h"
#include "boost/asio/post.hpp"  // NOLINT
#include "boost/asio/thread_pool.hpp"  // NOLINT
#include "tlbmc/pacemaker/pacemaker.h"
#include "tlbmc/redfish/request.h"
#include "tlbmc/redfish/response.h"
#include "tlbmc/redfish/routing.h"
#include "tlbmc/store/store.h"
#include "app_interface.h"
#include "dbus_utility.hpp" // NOLINT
#include "async_resp.hpp" // NOLINT
#include "http_request.hpp" // NOLINT
#include "router_interface.h"

// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define TLBMC_ROUTE(app, url) \
  app.template AddRoute<crow::black_magic::GetParameterTag(url)>(url)

namespace milotic_tlbmc {

// RedfishApp is a class that can be used to register Redfish routes and
// callbacks.
//
// Example:
//   RedfishApp app;
//   TLBMC_ROUTE(app, "/foo/")
//       .methods(boost::beast::http::verb::get)(
//           [](const RedfishRequest& req, RedfishResponse& resp) {
//             // business logic here
//           });
//   app.Validate();
//
//   // Handle new coming request
//   app.Handle(req, resp);
//
//
class RedfishApp : public ::crow::AppInterface {
 public:
  // The Redfish app for tlbmc only.
  explicit RedfishApp(std::unique_ptr<milotic_tlbmc::Store> store);
  explicit RedfishApp(std::unique_ptr<milotic_tlbmc::Pacemaker> pacemaker);
  RedfishApp() = default;
  RedfishApp(const RedfishApp&) = delete;
  RedfishApp(RedfishApp&&) = delete;
  RedfishApp& operator=(const RedfishApp&) = delete;
  RedfishApp& operator=(const RedfishApp&&) = delete;

  virtual ~RedfishApp() { thread_pool_.join(); }

  // Takes ownership of the request and response and handles the request
  // asynchronously.
  void Handle(RedfishRequest&& req, RedfishResponse&& resp) const;

  // Takes ownership of the request and response and handles the request
  // synchronously.
  void HandleFromCrowRequest(
      const ::crow::Request& req,
      const std::shared_ptr<bmcweb::AsyncResp>& async_resp) const override;

  // Validates the routes and prepares the router for handling requests.
  // Must be called before `Handle`.
  void Validate();

  std::vector<std::string_view> GetRegisteredRoutes() const;

  template <uint64_t Tag>
  auto& AddRoute(std::string_view rule) {
    return router_.NewRuleTagged<Tag>(rule);
  }

  template <uint64_t Tag, typename Func>
  void ReplaceHandler(std::string_view url, boost::beast::http::verb verb,
                      Func&& func) {
    router_.ReplaceHandler<Tag>(url, verb, func);
  }
  template <uint64_t Tag>
  void RemoveHandler(std::string_view url, boost::beast::http::verb verb) {
    router_.RemoveRuleTagged<Tag>(url, verb);
  }
  template <uint64_t Tag, typename Func>
  void AppendHandler(std::string_view url, boost::beast::http::verb verb,
                     Func&& func) {
    router_.AppendHandler<Tag>(url, verb, func);
  }

  // Returns the list of supported URLs. URLs are sorted and does not contain
  // slashes at the end.
  absl::flat_hash_set<std::string> GetSupportedUrls() const;

  // These are URLs that tlBMC fully owns and can in-place replace gbmcweb.
  absl::flat_hash_set<std::string> GetOwnedUrls() const override;

  virtual Store* GetStore() const { return store_.get(); }

  virtual crow::Router& GetRouter() { return router_; }

  void SetSmartRouter(::crow::RouterInterface* smart_router) override;

  void DebugPrint() const override;

 protected:
  void HandleInternal(const RedfishRequest& req, RedfishResponse& resp) const;

  crow::Router router_;
  std::unique_ptr<milotic_tlbmc::Store> store_;
  mutable boost::asio::thread_pool thread_pool_;
  std::unique_ptr<milotic_tlbmc::Pacemaker> pacemaker_;
};

}  // namespace milotic_tlbmc

#endif  // THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_REDFISH_APP_H_
