#ifndef THIRD_PARTY_GBMCWEB_REDFISH_CORE_INCLUDE_UTILS_TELEMETRY_UTILS_H_
#define THIRD_PARTY_GBMCWEB_REDFISH_CORE_INCLUDE_UTILS_TELEMETRY_UTILS_H_

#include <cstddef>
#include <functional>
#include <optional>
#include <string>
#include <utility>
#include <vector>

#include "boost/container/flat_map.hpp"  // NOLINT
#include "boost/container/flat_set.hpp"  // NOLINT
#include "logging.hpp"
#include "utility.hpp"
#include "sdbusplus/message/native_types.hpp"

namespace redfish {

namespace telemetry {
constexpr const char* service = "xyz.openbmc_project.Telemetry";
constexpr const char* reportInterface = "xyz.openbmc_project.Telemetry.Report";

inline std::string getDbusReportPath(const std::string& id) {
  sdbusplus::message::object_path reportsPath(
      "/xyz/openbmc_project/Telemetry/Reports/TelemetryService");
  return {reportsPath / id};
}

struct IncorrectMetricUri {
  std::string uri;
  size_t index;
};

inline std::optional<IncorrectMetricUri> getChassisSensorNode(
    const std::vector<std::string>& uris,
    boost::container::flat_set<std::pair<std::string, std::string>>& matched) {
  size_t uriIdx = 0;
  for (const std::string& uri : uris) {
    auto parsed = boost::urls::parse_relative_ref(uri);

    if (!parsed) {
      BMCWEB_LOG_ERROR << "Failed to get chassis and sensor Node "
                          "from "
                       << uri;
      return std::make_optional<IncorrectMetricUri>({uri, uriIdx});
    }

    std::string chassis;
    std::string node;

    if (crow::utility::readUrlSegments(*parsed, "redfish", "v1", "Chassis",
                                       std::ref(chassis), std::ref(node))) {
      matched.emplace(std::move(chassis), std::move(node));
      uriIdx++;
      continue;
    }

    // Those 2 segments cannot be validated here, as we don't know which
    // sensors exist at the moment of parsing.
    std::string ignoredSenorId;

    if (crow::utility::readUrlSegments(*parsed, "redfish", "v1", "Chassis",
                                       std::ref(chassis), "Sensors",
                                       std::ref(ignoredSenorId))) {
      matched.emplace(std::move(chassis), "Sensors");
      uriIdx++;
      continue;
    }

    BMCWEB_LOG_ERROR << "Failed to get chassis and sensor Node "
                        "from "
                     << uri;
    return std::make_optional<IncorrectMetricUri>({uri, uriIdx});
  }
  return std::nullopt;
}

}  // namespace telemetry
}  // namespace redfish

#endif  // THIRD_PARTY_GBMCWEB_REDFISH_CORE_INCLUDE_UTILS_TELEMETRY_UTILS_H_
