#ifndef THIRD_PARTY_GBMCWEB_REDFISH_CORE_LIB_THERMAL_SUBSYSTEM_H_
#define THIRD_PARTY_GBMCWEB_REDFISH_CORE_LIB_THERMAL_SUBSYSTEM_H_

#include <functional>
#include <memory>
#include <optional>
#include <string>

#include "boost/url/format.hpp"  // NOLINT
#include "app.hpp"
#include "http_request.hpp"
#include "logging.hpp"
#include "utility.hpp"
#include "async_resp.hpp"
#include "error_messages.hpp"
#include "query.hpp"
#include "registries/privilege_registry.hpp"
#include "chassis_utils.hpp"

namespace redfish {

inline void doThermalSubsystemCollection(
    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
    const std::string& chassisId,
    const std::optional<std::string>& validChassisPath) {
  if (!validChassisPath) {
    BMCWEB_LOG_WARNING << "Not a valid chassis ID" << chassisId;
    messages::resourceNotFound(asyncResp->res, "Chassis", chassisId);
    return;
  }

  asyncResp->res.addHeader(boost::beast::http::field::link,
                           "</redfish/v1/JsonSchemas/ThermalSubsystem/"
                           "ThermalSubsystem.json>; rel=describedby");
  asyncResp->res.jsonValue["@odata.type"] =
      "#ThermalSubsystem.v1_0_0.ThermalSubsystem";
  asyncResp->res.jsonValue["Name"] = "Thermal Subsystem";
  asyncResp->res.jsonValue["Id"] = "ThermalSubsystem";

  asyncResp->res.jsonValue["@odata.id"] = crow::utility::urlFromPieces(
      "redfish", "v1", "Chassis", chassisId, "ThermalSubsystem");

  asyncResp->res.jsonValue["Fans"]["@odata.id"] = boost::urls::format(
      "/redfish/v1/Chassis/{}/ThermalSubsystem/Fans", chassisId);

  asyncResp->res.jsonValue["Status"]["State"] = "Enabled";
  asyncResp->res.jsonValue["Status"]["Health"] = "OK";
  asyncResp->res.jsonValue["Fans"]["@odata.id"] =
      crow::utility::urlFromPieces("redfish", "v1", "Chassis", chassisId,
                                   "ThermalSubsystem", "Fans")
          .buffer();
}

inline void handleThermalSubsystemCollectionHead(
    App& app, const crow::Request& req,
    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
    const std::string& chassisId) {
  if (!redfish::setUpRedfishRoute(app, req, asyncResp)) {
    return;
  }

  auto respHandler = [asyncResp, chassisId](
                         const std::optional<std::string>& validChassisPath) {
    if (!validChassisPath) {
      messages::resourceNotFound(asyncResp->res, "Chassis", chassisId);
      return;
    }
    asyncResp->res.addHeader(boost::beast::http::field::link,
                             "</redfish/v1/JsonSchemas/ThermalSubsystem/"
                             "ThermalSubsystem.json>; rel=describedby");
  };
  redfish::chassis_utils::getValidChassisPath(asyncResp, chassisId,
                                              std::bind_front(respHandler));
}

inline void handleThermalSubsystemCollectionGet(
    App& app, const crow::Request& req,
    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
    const std::string& chassisId) {
  if (!redfish::setUpRedfishRoute(app, req, asyncResp)) {
    return;
  }

  redfish::chassis_utils::getValidChassisPath(
      asyncResp, chassisId,
      std::bind_front(doThermalSubsystemCollection, asyncResp, chassisId));
}

inline void requestRoutesThermalSubsystem(App& app) {
  BMCWEB_ROUTE(app, "/redfish/v1/Chassis/<str>/ThermalSubsystem/")
      .privileges(redfish::privileges::headThermalSubsystem)
      .methods(boost::beast::http::verb::head)(
          std::bind_front(handleThermalSubsystemCollectionHead, std::ref(app)));

  BMCWEB_ROUTE(app, "/redfish/v1/Chassis/<str>/ThermalSubsystem/")
      .privileges(redfish::privileges::getThermalSubsystem)
      .methods(boost::beast::http::verb::get)(
          std::bind_front(handleThermalSubsystemCollectionGet, std::ref(app)));
}

}  // namespace redfish

#endif  // THIRD_PARTY_GBMCWEB_REDFISH_CORE_LIB_THERMAL_SUBSYSTEM_H_
