#include "app.hpp"

#include <memory>

#include "http_request.hpp"
#include "http_server.hpp"
#include "logging.hpp"
#include "async_resp.hpp"
#include "request_stats.hpp"

namespace crow {

#ifdef BMCWEB_ENABLE_SSL
using ssl_context_t = boost::asio::ssl::context;
using ssl_socket_t = boost::beast::ssl_stream<boost::asio::ip::tcp::socket>;
using ssl_server_t = Server<App, ssl_socket_t>;
#else
using socket_t = boost::asio::ip::tcp::socket;
using server_t = Server<App, socket_t>;
#endif

#ifdef BMCWEB_ENABLE_SSL
std::unique_ptr<ssl_server_t> sslServer;  // NOLINT
#else
std::unique_ptr<server_t> server;  // NOLINT
#endif

void App::run() {
#ifdef BMCWEB_ENABLE_SSL
  if (-1 == socketFd) {
    sslServer = std::make_unique<ssl_server_t>(this, bindaddrStr, portUint,
                                               sslContext, io);
  } else {
    sslServer = std::make_unique<ssl_server_t>(this, socketFd, sslContext, io);
  }
  sslServer->run();

#else
  if (-1 == socketFd) {
    server =
        std::make_unique<server_t>(this, bindaddrStr, portUint, nullptr, io);
  } else {
    server = std::make_unique<server_t>(this, socketFd, nullptr, io);
  }
  server->run();
#endif
}

void App::debugPrint()

{
  BMCWEB_LOG_DEBUG << "Routing:";
  router.DebugPrint();
}

void App::handle(Request& req,
                 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
  // allocate a requestStatsContext to track this request:
  asyncResp->requestStatsContext =
      std::make_shared<managedStore::RequestStatsContext>(
          managedStore::RequestStatsContext::queryURLKeyFor(req.method(),
                                                            req.url()));

  BMCWEB_LOG_INFO << "App: handle: "
                  << asyncResp->requestStatsContext->toJson();

  router.Handle(req, asyncResp);
}

}  // namespace crow
