#pragma once

#include "device.hpp"
#include "device_monitor.hpp"

#include <sdbusplus/bus.hpp>
#include <sdbusplus/server.hpp>
#include <sdeventplus/event.hpp>

namespace phosphor
{
namespace power
{

/**
 * @class RuntimeMonitor
 *
 * Monitors the power sequencer for faults at runtime
 *
 * Triggers the power sequencer fault check 2 different ways:
 *
 * 1) Listens for the PowerLost signal that indicates master
 *    PGOOD was dropped due to a fatal fault.  After the analysis,
 *    a power off will be issued so the sequencer will stop
 *    driving power to a faulted component.
 *
 * 2) Polls for faults, as some won't always drop PGOOD.
 *
 * The application this runs in will only run while PGOOD is
 * expected to be asserted, so any loss of PGOOD is considered
 * an error.
 */
class RuntimeMonitor : public DeviceMonitor
{
  public:
    RuntimeMonitor() = delete;
    ~RuntimeMonitor() = default;
    RuntimeMonitor(const RuntimeMonitor&) = delete;
    RuntimeMonitor& operator=(const RuntimeMonitor&) = delete;
    RuntimeMonitor(RuntimeMonitor&&) = delete;
    RuntimeMonitor& operator=(RuntimeMonitor&&) = delete;

    /**
     * Constructor
     *
     * @param[in] d - the device to monitor
     * @param[in] b - D-Bus bus object
     * @param[in] e - event object
     * @param[in] i - poll interval
     */
    RuntimeMonitor(std::unique_ptr<phosphor::power::Device>&& d,
                   sdbusplus::bus_t& b, const sdeventplus::Event& e,
                   std::chrono::milliseconds& i) :
        DeviceMonitor(std::move(d), e, i),
        bus(b), match(bus, getMatchString(),
                      std::bind(std::mem_fn(&RuntimeMonitor::onPowerLost), this,
                                std::placeholders::_1))
    {}

    /**
     * Clears faults and then runs DeviceMonitor::run to
     * call Device::analyze() on an ongoing interval.
     *
     * @return the return value from sd_event_loop()
     */
    int run() override;

  private:
    /**
     * The PowerLost signal handler.
     *
     * After doing an analysis, will issue a power off
     * as some device has a power fault and needs to be
     * properly shut down.
     *
     * @param[in] msg - D-Bus message for callback
     */
    void onPowerLost(sdbusplus::message_t& msg);

    /**
     * Returns the match string for the PowerLost signal
     */
    std::string getMatchString()
    {
        using namespace sdbusplus::bus::match::rules;

        std::string s = type::signal() + path("/org/openbmc/control/power0") +
                        interface("org.openbmc.control.Power") +
                        member("PowerLost");

        return s;
    }

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

    /**
     * Match object for PowerLost signals
     */
    sdbusplus::bus::match_t match;
};

} // namespace power
} // namespace phosphor
