#pragma once
#include "callback.hpp"

namespace phosphor
{
namespace dbus
{
namespace monitoring
{
/** @class Trap
 *  @brief Raises SNMP trap
 */
class Trap
{
  public:
    Trap() = default;
    Trap(const Trap&) = delete;
    Trap(Trap&&) = default;
    Trap& operator=(const Trap&) = delete;
    Trap& operator=(Trap&&) = default;
    virtual ~Trap() = default;
    /** @brief Raise SNMP trap by parsing the sdbus message.
     *  @param[in] msg - sdbus message.
     */
    virtual void trap(sdbusplus::message::message& msg) const = 0;
};

/** @class ErrorTrap
 *  @brief Sends SNMP trap for the elog error
 */
class ErrorTrap : public Trap
{
  public:
    ErrorTrap() = default;
    ErrorTrap(const ErrorTrap&) = delete;
    ErrorTrap(ErrorTrap&&) = default;
    ErrorTrap& operator=(const ErrorTrap&) = delete;
    ErrorTrap& operator=(ErrorTrap&&) = default;
    ~ErrorTrap() = default;

    /** @brief Raise SNMP trap by parsing the sdbus message.
     *  @param[in] msg - sdbus message.
     */
    void trap(sdbusplus::message::message& msg) const override;
};

/** @class SNMPTrap
 *  @brief SNMP trap callback implementation.
 */
template <typename T>
class SNMPTrap : public Callback
{
  public:
    SNMPTrap(const SNMPTrap&) = delete;
    SNMPTrap(SNMPTrap&&) = default;
    SNMPTrap& operator=(const SNMPTrap&) = delete;
    SNMPTrap& operator=(SNMPTrap&&) = default;
    virtual ~SNMPTrap() = default;
    SNMPTrap() : Callback()
    {}

    /** @brief Callback interface implementation.
     *  @param[in] ctc - context.
     */
    void operator()(Context ctx)
    {}

    /** @brief Callback interface implementation.
     *  @param[in] ctc - context.
     *  @param[in] msg - sdbus message.
     */
    void operator()(Context ctx, sdbusplus::message::message& msg)
    {
        event.trap(msg);
    }

  private:
    T event;
};

} // namespace monitoring
} // namespace dbus
} // namespace phosphor
