#ifndef THIRD_PARTY_GBMCWEB_REDFISH_CORE_LIB_POWER_SUBSYSTEM_H_
#define THIRD_PARTY_GBMCWEB_REDFISH_CORE_LIB_POWER_SUBSYSTEM_H_

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

#include "app.hpp"
#include "async_resp.hpp"
#include "query.hpp"
#include "error_messages.hpp"
#include "registries/privilege_registry.hpp"
#include "chassis_utils.hpp"
#include "utility.hpp"
#include "http_request.hpp"

namespace redfish {

inline void doPowerSubsystemCollection(
    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
    const std::string& 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/PowerSubsystem/"
                           "PowerSubsystem.json>; rel=describedby");
  asyncResp->res.jsonValue["@odata.type"] =
      "#PowerSubsystem.v1_1_0.PowerSubsystem";
  asyncResp->res.jsonValue["Name"] = "Power Subsystem";
  asyncResp->res.jsonValue["Id"] = "PowerSubsystem";
  asyncResp->res.jsonValue["@odata.id"] = crow::utility::urlFromPieces(
      "redfish", "v1", "Chassis", chassisId, "PowerSubsystem");
  asyncResp->res.jsonValue["Status"]["State"] = "Enabled";
  asyncResp->res.jsonValue["Status"]["Health"] = "OK";
  asyncResp->res.jsonValue["PowerSupplies"]["@odata.id"] =
      crow::utility::urlFromPieces("redfish", "v1", "Chassis", chassisId,
                                   "PowerSubsystem", "PowerSupplies");
}

inline void handlePowerSubsystemCollectionHead(
    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/PowerSubsystem/"
                             "PowerSubsystem.json>; rel=describedby");
  };
  redfish::chassis_utils::getValidChassisPath(asyncResp, chassisId,
                                              std::move(respHandler));
}

inline void handlePowerSubsystemCollectionGet(
    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(doPowerSubsystemCollection, asyncResp, chassisId));
}

inline void requestRoutesPowerSubsystem(App& app) {
  BMCWEB_ROUTE(app, "/redfish/v1/Chassis/<str>/PowerSubsystem/")
      .privileges(redfish::privileges::headPowerSubsystem)
      .methods(boost::beast::http::verb::head)(
          std::bind_front(handlePowerSubsystemCollectionHead, std::ref(app)));

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

}  // namespace redfish

#endif  // THIRD_PARTY_GBMCWEB_REDFISH_CORE_LIB_POWER_SUBSYSTEM_H_
