#include "tlbmc/redfish/request.h"

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

#include "absl/status/statusor.h"
#include "absl/strings/match.h"
#include "absl/strings/string_view.h"
#include "redfish_v1.pb.h"
#include "g3/macros.h"
#include "tlbmc/redfish/query_parameters.h"

namespace milotic_tlbmc {

RedfishRequest::RedfishRequest(const ::redfish::v1::Request& request,
                               boost::beast::http::verb method) {
  request_.target(TrimTlbmcPrefix(request.url()));
  request_.method(method);

  if (!request.json_str().empty()) {
    request_.body() = request.json_str();
  } else if (request.has_octet_stream()) {
    request_.body() = request.octet_stream();
  }

  for (const auto& [key, value] : request.headers()) {
    request_.base().insert(key, value);
  };
}
absl::StatusOr<RedfishRequest> RedfishRequest::Create(
    boost::beast::http::request<boost::beast::http::string_body>&& request) {
  RedfishRequest redfish_request(std::move(request));

  redfish_request.SetTlbmcOnly(HasTlbmcPrefix(redfish_request.Target()));

  // Trim tlbmc prefix before doing anything else
  boost::urls::url target(TrimTlbmcPrefix(redfish_request.Target()));

  // Remove Query Parameters from the target
  redfish_request.request_.target(target.encoded_path());

  ECCLESIA_ASSIGN_OR_RETURN(redfish_request.query_parameters_,
                            QueryParameters::Create(target.params()));

  return redfish_request;
}

std::string_view RedfishRequest::Target() const { return request_.target(); }

boost::beast::http::verb RedfishRequest::Method() const {
  return request_.method();
}

std::string_view RedfishRequest::GetHeaderValue(std::string_view key) const {
  return request_[key];
}

std::string_view RedfishRequest::Body() const { return request_.body(); }

std::string_view RedfishRequest::TrimTlbmcPrefix(std::string_view url) {
  if (absl::StartsWith(url, kTlbmcPrefix)) {
    // Need to preserve the leading '/'
    url = url.substr(kTlbmcPrefix.size() - 1);
  }
  return url;
}

bool RedfishRequest::HasTlbmcPrefix(std::string_view url) {
  return absl::StartsWith(url, kTlbmcPrefix);
}

}  // namespace milotic_tlbmc
