#pragma once

#include <experimental/tuple>
#include "callback.hpp"

namespace phosphor
{
namespace dbus
{
namespace monitoring
{
namespace detail
{

/** @class CallDBusMethod
 *  @brief Provide explicit call forwarding to
 *     DBusInterface::callMethodNoReply.
 *
 *  @tparam DBusInterface - The DBus interface to use.
 *  @tparam MethodArgs - DBus method argument types.
 */
template <typename DBusInterface, typename ...MethodArgs>
struct CallDBusMethod
{
    static void op(
        const std::string& bus,
        const std::string& path,
        const std::string& iface,
        const std::string& method,
        MethodArgs&& ...args)
    {
        DBusInterface::callMethodNoReply(
            bus,
            path,
            iface,
            method,
            std::forward<MethodArgs>(args)...);
    }
};
} // namespace detail

/** @class MethodBase
 *  @brief Invoke DBus method callback implementation.
 *
 *  The method callback invokes the client supplied DBus method.
 */
class MethodBase : public Callback
{
    public:
        MethodBase() = delete;
        MethodBase(const MethodBase&) = delete;
        MethodBase(MethodBase&&) = default;
        MethodBase& operator=(const MethodBase&) = delete;
        MethodBase& operator=(MethodBase&&) = default;
        virtual ~MethodBase() = default;
        MethodBase(
            const std::string& b,
            const std::string& p,
            const std::string& i,
            const std::string& m)
            : Callback(),
              bus(b),
              path(p),
              interface(i),
                  method(m) {}

        /** @brief Callback interface implementation. */
        void operator()(Context ctx) override = 0;

    protected:
        const std::string& bus;
        const std::string& path;
        const std::string& interface;
        const std::string& method;
};

/** @class Method
 *  @brief C++ type specific logic for the method callback.
 *
 *  @tparam DBusInterface - The DBus interface to use to call the method.
 *  @tparam MethodArgs - DBus method argument types.
 */
template <typename DBusInterface, typename ...MethodArgs>
class Method : public MethodBase
{
    public:
        Method() = delete;
        Method(const Method&) = default;
        Method(Method&&) = default;
        Method& operator=(const Method&) = default;
        Method& operator=(Method&&) = default;
        ~Method() = default;
        Method(
            const std::string& bus,
            const std::string& path,
            const std::string& iface,
            const std::string& method,
            MethodArgs&& ... arguments)
            : MethodBase(bus, path, iface, method),
              args(std::forward<MethodArgs>(arguments)...) {}

        /** @brief Callback interface implementation. */
        void operator()(Context ctx) override
        {
            std::experimental::apply(
                detail::CallDBusMethod<DBusInterface, MethodArgs...>::op,
                std::tuple_cat(
                    std::make_tuple(bus),
                    std::make_tuple(path),
                    std::make_tuple(interface),
                    std::make_tuple(method),
                    args));
        }

    private:
        std::tuple<MethodArgs...> args;
};

/** @brief Argument type deduction for constructing Method instances. */
template <typename DBusInterface, typename ...MethodArgs>
auto makeMethod(
    const std::string& bus,
    const std::string& path,
    const std::string& iface,
    const std::string& method,
    MethodArgs&& ... arguments)
{
    return std::make_unique<Method<DBusInterface, MethodArgs...>>(
               bus,
               path,
               iface,
               method,
               std::forward<MethodArgs>(arguments)...);
}

} // namespace monitoring
} // namespace dbus
} // namespace phosphor
