#pragma once

#include <phosphor-logging/log.hpp>
#include <sdbusplus/bus.hpp>
#include <string>

namespace witherspoon
{
namespace power
{
namespace util
{

constexpr auto PROPERTY_INTF = "org.freedesktop.DBus.Properties";

/**
 * @brief Get the service name from the mapper for the
 *        interface and path passed in.
 *
 * @param[in] path - the D-Bus path name
 * @param[in] interface - the D-Bus interface name
 * @param[in] bus - the D-Bus object
 *
 * @return The service name
 */
std::string getService(const std::string& path,
                       const std::string& interface,
                       sdbusplus::bus::bus& bus);

/**
 * @brief Read a D-Bus property
 *
 * @param[in] interface - the interface the property is on
 * @param[in] propertName - the name of the property
 * @param[in] path - the D-Bus path
 * @param[in] service - the D-Bus service
 * @param[in] bus - the D-Bus object
 * @param[out] value - filled in with the property value
 */
template<typename T>
void getProperty(const std::string& interface,
                 const std::string& propertyName,
                 const std::string& path,
                 const std::string& service,
                 sdbusplus::bus::bus& bus,
                 T& value)
{
    sdbusplus::message::variant<T> property;

    auto method = bus.new_method_call(service.c_str(),
            path.c_str(),
            PROPERTY_INTF,
            "Get");

    method.append(interface, propertyName);

    auto reply = bus.call(method);
    if (reply.is_method_error())
    {
        using namespace phosphor::logging;
        log<level::ERR>("Error in property get call",
                entry("PATH=%s", path.c_str()),
                entry("PROPERTY=%s", propertyName.c_str()));
        //
        // TODO openbmc/openbmc#851 - Once available, throw returned error
        throw std::runtime_error("Error in property get call");
    }

    reply.read(property);
    value = sdbusplus::message::variant_ns::get<T>(property);
}

}
}
}
