#pragma once

#include <sdbusplus/bus.hpp>

struct SensorProperties
{
    int64_t scale;
    int64_t value;
    std::string unit;
};

const std::string sensorintf = "xyz.openbmc_project.Sensor.Value";
const std::string propertiesintf = "org.freedesktop.DBus.Properties";

class DbusHelperInterface
{
    public:
        virtual ~DbusHelperInterface() = default;

        /** @brief Get the service providing the interface for the path.
         */
        virtual std::string GetService(sdbusplus::bus::bus& bus,
                                       const std::string& intf,
                                       const std::string& path) = 0;

        /** @brief Get all Sensor.Value properties for a service and path.
         *
         * @param[in] bus - A bus to use for the call.
         * @param[in] service - The service providing the interface.
         * @param[in] path - The dbus path.
         * @param[out] prop - A pointer to a properties struct to fill out.
         */
        virtual void GetProperties(sdbusplus::bus::bus& bus,
                                   const std::string& service,
                                   const std::string& path,
                                   struct SensorProperties* prop) = 0;
};

class DbusHelper : public DbusHelperInterface
{
    public:
        DbusHelper() = default;
        ~DbusHelper() = default;
        DbusHelper(const DbusHelper&) = default;
        DbusHelper& operator=(const DbusHelper&) = default;
        DbusHelper(DbusHelper&&) = default;
        DbusHelper& operator=(DbusHelper&&) = default;

        std::string GetService(sdbusplus::bus::bus& bus,
                               const std::string& intf,
                               const std::string& path) override;

        void GetProperties(sdbusplus::bus::bus& bus,
                           const std::string& service,
                           const std::string& path,
                           struct SensorProperties* prop) override;
};

std::string GetSensorPath(const std::string& type, const std::string& id);
std::string GetMatch(const std::string& type, const std::string& id);
bool ValidType(const std::string& type);
