#pragma once

#include "occ_errors.hpp"
namespace open_power
{
namespace occ
{

class Manager;

/** @class Presence
 *  @brief Monitors the number of OCCs present
 */
class Presence : public Error
{
    public:
        Presence() = delete;
        Presence(const Presence&) = delete;
        Presence& operator=(const Presence&) = delete;
        Presence(Presence&&) = default;
        Presence& operator=(Presence&&) = default;

        /** @brief Constructs the Presence object
         *
         *  @param[in] event    - Reference to sd_event unique_ptr
         *  @param[in] file     - File used by driver to communicate errors
         *  @param[in] mgr      - OCC manager instance
         *  @param[in] callBack - Optional function callback on error condition
         */
        Presence(EventPtr& event,
              const fs::path& file,
              const Manager& mgr,
              std::function<void(bool)> callBack = nullptr) :
            Error(event, file, callBack),
            manager(mgr)
        {
            // Nothing to do here.
        }

    private:
        /** Store the manager instance to enable getting number of OCCs */
        const Manager& manager;

        /** @brief When the error event is received, analyzes it
         *         and makes a callback to error handler if the
         *         content denotes an error condition
         */
        void analyzeEvent() override;
};

} // namespace occ
} // namespace open_power
