#ifndef PRODUCTION_SUSHID_SAFEPOWER_AGENT_BMC_STATE_MONITOR_BMC_H_
#define PRODUCTION_SUSHID_SAFEPOWER_AGENT_BMC_STATE_MONITOR_BMC_H_

#include <memory>
#include <string>

#include "safepower_agent.pb.h"
#include "safepower_agent_config.pb.h"
#include "state_updater.h"
#include "absl/status/status.h"
#include "absl/strings/string_view.h"

namespace safepower_agent {

class StateMonitorBMC {
 public:
  explicit StateMonitorBMC(
      std::shared_ptr<StateUpdater<safepower_agent_proto::SystemState>>
          reactor);
  ~StateMonitorBMC() = default;

  absl::Status BuildFromConfig(
      const safepower_agent_config::GpowerdConfig& config);

 private:
  absl::Status CreateRedfishUpdatePowerState(std::string state_name,
                                             std::string uri,
                                       std::string json_key,
                                       int collection_interval,
                                       std::string node_entity_tag,
                                       std::string component_name);

  absl::Status CreateDbusStateMonitor(std::string state_name,
                                    std::string dbus_path,
                        std::string dbus_method, std::string dbus_interface,
                        std::string dbus_value, int collection_interval);

  safepower_agent_proto::PowerStateSpecifier
    ConvertStatePowerStringToEnum(absl::string_view state_str);

  std::shared_ptr<StateUpdater<safepower_agent_proto::SystemState>> reactor_;
};

}  // namespace safepower_agent

#endif  // PRODUCTION_SUSHID_SAFEPOWER_AGENT_BMC_STATE_MONITOR_BMC_H_
