#pragma once

#include <sdbusplus/bus.hpp>
#include <sdbusplus/bus/match.hpp>

namespace phosphor::virtual_sensor
{

class VirtualSensor;

class DbusSensor
{
  public:
    DbusSensor() = delete;
    virtual ~DbusSensor() = default;

    /** @brief Constructs DbusSensor
     *
     * @param[in] bus     - Handle to system dbus
     * @param[in] path    - The Dbus path of sensor
     */
    DbusSensor(sdbusplus::bus_t& bus, const std::string& path,
               VirtualSensor& virtualSensor);

    /** @brief Get sensor value from local */
    double getSensorValue();

  private:
    /** @brief sdbusplus bus client connection. */
    sdbusplus::bus_t& bus;

    /** @brief complete path for sensor */
    std::string path{};

    /** @brief service name for the sensor daemon */
    std::string servName{};

    /** @brief point to the VirtualSensor */
    VirtualSensor& virtualSensor;

    /** @brief signal for sensor value change */
    sdbusplus::bus::match_t signalPropChange;

    /** @brief signal for sensor interface remove */
    sdbusplus::bus::match_t signalRemove;

    /** @brief Match for this dbus sensor service destroy  */
    std::unique_ptr<sdbusplus::bus::match_t> signalNameOwnerChanged;

    /** @brief dbus sensor value */
    double value = std::numeric_limits<double>::quiet_NaN();

    /** @brief Get sensor value property from D-bus interface */
    void initSensorValue();

    /** @brief Handle for this dbus sensor NameOwnerChanged */
    void handleDbusSignalNameOwnerChanged(sdbusplus::message_t& msg);

    /** @brief Handle for this dbus sensor PropertyChanged */
    void handleDbusSignalPropChange(sdbusplus::message_t& msg);

    /** @brief Handle for this dbus sensor InterfaceRemove */
    void handleDbusSignalRemove(sdbusplus::message_t& msg);
};

} // namespace phosphor::virtual_sensor
