#pragma once

#include <chrono>
#include <cmath>
#include <iostream>
#include <map>
#include <mutex>
#include <set>
#include <string>
#include <tuple>
#include <vector>

#include <sdbusplus/bus.hpp>
#include <sdbusplus/message.hpp>
#include <sdbusplus/server.hpp>

#include "interfaces.hpp"
#include "dbus/util.hpp"

int DbusHandleSignal(sd_bus_message* msg, void* data, sd_bus_error* err);

/*
 * This ReadInterface will passively listen for Value updates from whomever
 * owns the associated dbus object.
 *
 * This requires another modification in phosphor-dbus-interfaces that will
 * signal a value update every time it's read instead of only when it changes
 * to help us:
 * - ensure we're still receiving data (since we don't control the reader)
 * - simplify stale data detection
 * - simplify error detection
 */
class DbusPassive : public ReadInterface
{
    public:
        DbusPassive(sdbusplus::bus::bus& bus,
                    const std::string& type,
                    const std::string& id,
                    DbusHelperInterface *helper);

        ReadReturn read(void) override;

        void setValue(double value);
        int64_t getScale(void);
        std::string getId(void);

    private:
        sdbusplus::bus::bus& _bus;
        sdbusplus::server::match::match _signal;
        int64_t _scale;
        std::string _id; // for debug identification
        DbusHelperInterface *_helper;

        std::mutex _lock;
        double _value = 0;
        /* The last time the value was refreshed, not necessarily changed. */
        std::chrono::high_resolution_clock::time_point _updated;
};

int HandleSensorValue(sdbusplus::message::message& msg, DbusPassive* owner);
