#pragma once

#include <sdbusplus/bus.hpp>

#include <map>
#include <string>

namespace phosphor::power::sequencer
{

/**
 * @class PowerSequencerMonitor
 * Define a base class for monitoring a power sequencer device.
 */
class PowerSequencerMonitor
{
  public:
    PowerSequencerMonitor() = delete;
    PowerSequencerMonitor(const PowerSequencerMonitor&) = delete;
    PowerSequencerMonitor& operator=(const PowerSequencerMonitor&) = delete;
    PowerSequencerMonitor(PowerSequencerMonitor&&) = delete;
    PowerSequencerMonitor& operator=(PowerSequencerMonitor&&) = delete;
    virtual ~PowerSequencerMonitor() = default;

    /**
     * Create a base device object for power sequence monitoring.
     * @param[in] bus D-Bus bus object
     */
    explicit PowerSequencerMonitor(sdbusplus::bus::bus& bus);

    /**
     * Logs an error using the D-Bus Create method.
     * @param[in] message Message property of the error log entry
     * @param[in] additionalData AdditionalData property of the error log entry
     */
    void logError(const std::string& message,
                  std::map<std::string, std::string>& additionalData);

    /**
     * Analyzes the device for errors when the device is
     * known to be in an error state.  A log will be created.
     * @param[in] timeout if the failure state was determined by timing out
     * @param[in] powerSupplyError The power supply error to log. A default
     * std:string, i.e. empty string (""), is passed when there is no power
     * supply error to log.
     */
    virtual void onFailure(bool timeout, const std::string& powerSupplyError);

  protected:
    /**
     * The D-Bus bus object
     */
    sdbusplus::bus::bus& bus;
};

} // namespace phosphor::power::sequencer
