#pragma once

#include <memory>
#include <mutex>

#include <sdbusplus/bus.hpp>
#include <sdbusplus/server.hpp>
#include "xyz/openbmc_project/Sensor/Value/server.hpp"

#include "sensor.hpp"

template <typename... T>
using ServerObject = typename sdbusplus::server::object::object<T...>;

using ValueInterface = sdbusplus::xyz::openbmc_project::Sensor::server::Value;
using ValueObject = ServerObject<ValueInterface>;

/*
 * HostSensor object is a Sensor derivative that also implements a ValueObject,
 * which comes from the dbus as an object that implements Sensor.Value.
 */
class HostSensor : public Sensor, public ValueObject
{
    public:
        static std::unique_ptr<Sensor> CreateTemp(
            const std::string& name,
            int64_t timeout,
            sdbusplus::bus::bus& bus,
            const char* objPath,
            bool defer);

        HostSensor(const std::string& name,
                   int64_t timeout,
                   sdbusplus::bus::bus& bus,
                   const char* objPath,
                   bool defer)
            : Sensor(name, timeout),
              ValueObject(bus, objPath, defer)
        { }

        /* Note: This must be int64_t because it's from ValueObject */
        int64_t value(int64_t value) override;

        ReadReturn read(void) override;
        void write(double value) override;

    private:
        /*
         * _lock will be used to make sure _updated & _value are updated
         * together.
         */
        std::mutex _lock;
        std::chrono::high_resolution_clock::time_point _updated;
        double _value = 0;
};

