#pragma once

#include <sdbusplus/bus.hpp>

#include <string>
#include <tuple>

namespace settings
{

using Path = std::string;
using Service = std::string;
using Interface = std::string;

/** @class Objects
 *  @brief Fetch paths of settings d-bus objects of interest, upon construction
 */
struct Objects
{
  public:
    /** @brief Constructor - fetch settings objects
     *
     * @param[in] bus - The Dbus bus object
     * @param[in] filter - A vector of settings interfaces the caller is
     *            interested in.
     */
    Objects(sdbusplus::bus_t& bus, const std::vector<Interface>& filter);
    Objects(const Objects&) = default;
    Objects& operator=(const Objects&) = default;
    Objects(Objects&&) = delete;
    Objects& operator=(Objects&&) = delete;
    ~Objects() = default;

    /** @brief Fetch d-bus service, given a path and an interface. The
     *         service can't be cached because mapper returns unique
     *         service names.
     *
     * @param[in] path - The Dbus object
     * @param[in] interface - The Dbus interface
     *
     * @return std::string - the dbus service
     */
    Service service(const Path& path, const Interface& interface) const;

    /** @brief map of settings objects */
    std::map<Interface, std::vector<Path>> map;

    /** @brief The Dbus bus object */
    sdbusplus::bus_t& bus;
};

} // namespace settings
