#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
