#pragma once

#ifdef BMCWEB_ENABLE_GRPC
#include "absl/log/log.h"
#endif

#include <memory>
#include <string>
#include <string_view>
#include <system_error>  // NOLINT
#include <unordered_set>

#include "boost/asio/io_context.hpp"  // NOLINT
#include "boost/asio/ip/address.hpp"  // NOLINT
#include "boost/beast/http/message.hpp"  // NOLINT
#include "boost/beast/http/string_body.hpp"  // NOLINT
#include "boost/beast/websocket.hpp"  // NOLINT
#include "boost/url/url.hpp"  // NOLINT
#include "common.hpp"  // NOLINT(misc-include-cleaner)
#include "sessions.hpp"

namespace crow {

struct Request {
  boost::beast::http::request<boost::beast::http::string_body> req;

 private:
  boost::urls::url urlBase;  // NOLINT

 public:
  bool isSecure{false};  // NOLINT

  boost::asio::io_context* ioService{};  // NOLINT
  boost::asio::ip::address ipAddress;  // NOLINT

  std::shared_ptr<persistent_data::UserSession> session;

  bool isSubscriptionRequest = false;  // NOLINT

  // Dynamic fine grained authorization
  bool fromGrpc = false;  // NOLINT
  bool with_trust_bundle = false;
  bool peer_authenticated = false;
  std::unordered_set<std::string> peer_privileges;

  std::string userRole;  // NOLINT
  Request(boost::beast::http::request<boost::beast::http::string_body> reqIn,
          std::error_code& ec);

  Request(std::string_view bodyIn, std::error_code& ec);

  Request() = default;
  Request(const Request& other) = default;
  Request(Request&& other) = default;

  Request& operator=(const Request&) = delete;
  Request& operator=(const Request&&) = delete;
  ~Request() = default;

  boost::beast::http::verb method() const { return req.method(); }

  boost::beast::http::request<boost::beast::http::string_body> request() const {
    return req;
  }

  std::string_view getHeaderValue(std::string_view key) const {
    return req[key];
  }

  std::string_view getHeaderValue(boost::beast::http::field key) const {
    return req[key];
  }

  std::string_view methodString() const { return req.method_string(); }

  std::string_view target() const { return req.target(); }

  boost::urls::url& mutableUrl() { return urlBase; }

  boost::urls::url_view url() const { return {urlBase}; }

  const boost::beast::http::fields& fields() const { return req.base(); }

  const std::string& body() const { return req.body(); }

  bool target(std::string_view target) {
    req.target(target);
    return setUrlInfo();
  }

  void set_method(boost::beast::http::verb method) { req.method(method); }

  unsigned version() const { return req.version(); }

  bool isUpgrade() const { return boost::beast::websocket::is_upgrade(req); }

  bool keepAlive() const { return req.keep_alive(); }

 private:
  bool setUrlInfo();
};

}  // namespace crow
