#pragma once

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

namespace witherspoon
{
namespace power
{

/**
 * @class PGOODMonitor
 *
 * Monitors PGOOD and checks for errors on the power sequencer
 * if it doesn't come on in time.
 *
 * The run() function is designed to be called right after the
 * power sequencer device is told to kick off a power on.
 *
 * Future commits will analyze the power sequencer chip for errors
 * on a PGOOD fail.
 */
class PGOODMonitor : public DeviceMonitor
{
    public:

        PGOODMonitor() = delete;
        ~PGOODMonitor() = default;
        PGOODMonitor(const PGOODMonitor&) = delete;
        PGOODMonitor& operator=(const PGOODMonitor&) = delete;
        PGOODMonitor(PGOODMonitor&&) = delete;
        PGOODMonitor& operator=(PGOODMonitor&&) = delete;

        /**
         * Constructor
         *
         * @param[in] d - the device to monitor
         * @param[in] b - D-Bus bus object
         * @param[in] e - event object
         * @param[in] t - time to allow PGOOD to come up
         */
        PGOODMonitor(std::unique_ptr<witherspoon::power::Device>&& d,
                sdbusplus::bus::bus& b,
                const sdeventplus::Event& e,
                std::chrono::milliseconds& t) :
            DeviceMonitor(std::move(d), e, t),
            bus(b)
        {
        }

        /**
         * Analyzes the power sequencer for fails and then
         * notifies the event loop that it can exit.
         *
         * The timer callback.
         */
        void analyze() override;

        /**
         * Waits a specified amount of time for PGOOD to
         * come on, and if it fails to come on in that time
         * it will analyze the power sequencer for faults.
         *
         * It will exit after either PGOOD is asserted or
         * the device is analyzed for faults.
         *
         * @return - the return value from sd_event_loop()
         */
        int run() override;

    private:

        /**
         * Enables the properties changed signal callback
         * on the power object so we can tell when PGOOD
         * comes on.
         */
        void startListening();

        /**
         * The callback function for the properties changed
         * signal.
         */
        void propertyChanged();

        /**
         * Returns true if the system has been turned on
         * but PGOOD isn't up yet.
         */
        bool pgoodPending();

        /**
         * Used to break out of the event loop in run()
         */
        void exitEventLoop();

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

        /**
         * The match object for the properties changed signal
         */
        std::unique_ptr<sdbusplus::bus::match_t> match;
};

}
}
