#pragma once

#include <experimental/filesystem>
#include "fan_speed.hpp"

/** @class Targets
 *  @brief Target type traits.
 *
 *  @tparam T - The target type.
 */
template <typename T>
struct Targets
{
    static void fail()
    {
        static_assert(sizeof(Targets) == -1, "Unsupported Target type");
    }
};

/**@brief Targets specialization for fan speed. */
template <>
struct Targets<hwmon::FanSpeed>
{
    static constexpr InterfaceType type = InterfaceType::FAN_SPEED;
};

/** @brief addTarget
 *
 *  Creates the target type interface
 *
 *  @tparam T - The target type
 *
 *  @param[in] sensor - A sensor type and name
 *  @param[in] hwmonRoot - The root hwmon path
 *  @param[in] instance - The target instance name
 *  @param[in] info - The sdbusplus server connection and interfaces
 *
 *  @return A shared pointer to the target interface object
 *          Will be empty if no interface was created
 */
template <typename T>
std::shared_ptr<T> addTarget(const SensorSet::key_type& sensor,
                             const std::string& hwmonRoot,
                             const std::string& instance,
                             ObjectInfo& info)
{
    std::shared_ptr<T> target;
    namespace fs = std::experimental::filesystem;
    static constexpr bool deferSignals = true;

    auto& bus = *std::get<sdbusplus::bus::bus*>(info);
    auto& obj = std::get<Object>(info);
    auto& objPath = std::get<std::string>(info);

    // Check if target sysfs file exists
    auto targetPath = hwmonRoot + '/' + instance;
    auto sysfsFullPath = make_sysfs_path(targetPath,
                                         sensor.first,
                                         sensor.second,
                                         hwmon::entry::target);
    if (fs::exists(sysfsFullPath))
    {
        target = std::make_shared<T>(hwmonRoot,
                                     instance,
                                     sensor.second,
                                     bus,
                                     objPath.c_str(),
                                     deferSignals);
        auto type = Targets<T>::type;
        obj[type] = target;
    }

    return target;
}
