#include "tlbmc/redfish/verb.h"

#include <cstddef>
#include <optional>
#include <string>
#include <string_view>

#include "boost/beast/http/verb.hpp"  //NOLINT

namespace milotic_tlbmc {

std::optional<HttpVerb> HttpVerbFromBoost(boost::beast::http::verb verb) {
  switch (verb) {
    case boost::beast::http::verb::delete_:
      return HttpVerb::kDelete;
    case boost::beast::http::verb::get:
      return HttpVerb::kGet;
    case boost::beast::http::verb::head:
      return HttpVerb::kHead;
    case boost::beast::http::verb::options:
      return HttpVerb::kOptions;
    case boost::beast::http::verb::patch:
      return HttpVerb::kPatch;
    case boost::beast::http::verb::post:
      return HttpVerb::kPost;
    case boost::beast::http::verb::put:
      return HttpVerb::kPut;
    default:
      return std::nullopt;
  }
  return std::nullopt;
}

std::string_view HttpVerbToString(HttpVerb verb) {
  switch (verb) {
    case HttpVerb::kDelete:
      return "DELETE";
    case HttpVerb::kGet:
      return "GET";
    case HttpVerb::kHead:
      return "HEAD";
    case HttpVerb::kPatch:
      return "PATCH";
    case HttpVerb::kPost:
      return "POST";
    case HttpVerb::kPut:
      return "PUT";
    case HttpVerb::kOptions:
      return "OPTIONS";
    case HttpVerb::kMax:
      return "";
  }
  // Should never reach here
  return "";
}

std::string_view BoostVerbToString(boost::beast::http::verb v) {
  std::optional<HttpVerb> verb = HttpVerbFromBoost(v);
  if (!verb) {
    return "";
  }
  return HttpVerbToString(*verb);
}

size_t MethodFieldsForSingleBoostVerb(boost::beast::http::verb verb) {
  std::optional<HttpVerb> http_verb = HttpVerbFromBoost(verb);
  if (!http_verb) {
    return 0;
  }
  return MethodFieldsFromSingleHttpVerb(*http_verb);
}

bool MethodFieldsContainBoostVerb(size_t method_fields,
                                  boost::beast::http::verb verb) {
  std::optional<HttpVerb> http_verb = HttpVerbFromBoost(verb);
  if (!http_verb) {
    return false;
  }
  return MethodFieldsContainHttpVerb(method_fields, *http_verb);
}

std::string MethodFieldsToString(size_t method_fields) {
  std::string result;
  for (int verb_index = 0; verb_index < static_cast<int>(HttpVerb::kMax);
       ++verb_index) {
    HttpVerb http_verb = static_cast<HttpVerb>(verb_index);
    if (MethodFieldsContainHttpVerb(method_fields, (http_verb))) {
      result += HttpVerbToString(http_verb);
      result += ",";
    }
  }
  if (!result.empty() && result.back() == ',') {
    result.pop_back();
  }
  return result;
}

}  // namespace milotic_tlbmc
