#ifndef THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_REDFISH_REQUEST_H_
#define THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_REDFISH_REQUEST_H_

#include <string>
#include <string_view>
#include <unordered_set>
#include <utility>

#include "absl/status/statusor.h"
#include "boost/beast/http/string_body.hpp"  //NOLINT
#include "boost/beast/http/verb.hpp"  //NOLINT`
#include "boost/url/url.hpp"  // NOLINT
#include "redfish_v1.pb.h"
#include "tlbmc/redfish/query_parameters.h"

namespace milotic_tlbmc {

constexpr std::string_view kTlbmcPrefix = "/tlbmc/";

class RedfishRequest {
 public:
  static RedfishRequest CreateUnitTestRequest() { return RedfishRequest(); }
  RedfishRequest(const redfish::v1::Request& request,
                 boost::beast::http::verb method);

  explicit RedfishRequest(
      boost::beast::http::request<boost::beast::http::string_body>&& request)
      : request_(std::move(request)) {}

  static absl::StatusOr<RedfishRequest> Create(
      boost::beast::http::request<boost::beast::http::string_body>&& request);

  RedfishRequest(RedfishRequest&& request) = default;
  RedfishRequest& operator=(RedfishRequest&& request) = default;
  RedfishRequest(const RedfishRequest& request) = delete;
  RedfishRequest& operator=(const RedfishRequest& request) = delete;

  std::string_view Target() const;
  void SetTarget(std::string_view target) { request_.target(target); }

  boost::beast::http::verb Method() const;
  std::string_view GetHeaderValue(std::string_view key) const;
  std::string_view Body() const;

  void SetFromGrpc(bool from_grpc) { from_grpc_ = from_grpc; }

  bool FromGrpc() const { return from_grpc_; }

  void SetWithTrustBundle(bool with_trust_bundle) {
    with_trust_bundle_ = with_trust_bundle;
  }

  bool WithTrustBundle() const { return with_trust_bundle_; }

  void SetPeerAuthenticated(bool peer_authenticated) {
    peer_authenticated_ = peer_authenticated;
  }

  bool PeerAuthenticated() const { return peer_authenticated_; }

  void SetPeerPrivileges(
      const std::unordered_set<std::string>& peer_privileges) {
    peer_privileges_ = peer_privileges;
  }

  const std::unordered_set<std::string>& PeerPrivileges() const {
    return peer_privileges_;
  }

  const QueryParameters& GetQueryParameters() const {
    return query_parameters_;
  }

  bool TlbmcOnly() const { return tlbmc_only_; }

  void SetTlbmcOnly(bool tlbmc_only) { tlbmc_only_ = tlbmc_only; }

 protected:
  RedfishRequest() = default;

  static std::string_view TrimTlbmcPrefix(std::string_view url);

  static bool HasTlbmcPrefix(std::string_view url);

  boost::beast::http::request<boost::beast::http::string_body> request_;
  bool from_grpc_ = false;
  bool with_trust_bundle_ = false;
  bool peer_authenticated_ = false;
  bool tlbmc_only_ = false;
  std::unordered_set<std::string> peer_privileges_;

  QueryParameters query_parameters_;
};

}  // namespace milotic_tlbmc

#endif  // THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_REDFISH_REQUEST_H_
