#pragma once

#include <systemd/sd-bus.h>

// ABC for sdbus implementation.
namespace sdbusplus
{

// A wrapper for interfacing or testing sd-bus.  This will hold methods for
// buses, messages, etc.
class SdBusInterface
{
  public:
    virtual ~SdBusInterface() = default;

    virtual int sd_bus_add_object_manager(sd_bus *bus, sd_bus_slot **slot,
                                          const char *path) = 0;

    virtual int sd_bus_add_object_vtable(sd_bus *bus, sd_bus_slot **slot,
                                         const char *path,
                                         const char *interface,
                                         const sd_bus_vtable *vtable,
                                         void *userdata) = 0;

    virtual int sd_bus_attach_event(sd_bus *bus, sd_event *e, int priority) = 0;

    virtual int sd_bus_call(sd_bus *bus, sd_bus_message *m, uint64_t usec,
                            sd_bus_error *ret_error,
                            sd_bus_message **reply) = 0;

    virtual int sd_bus_detach_event(sd_bus *bus) = 0;

    virtual int sd_bus_emit_interfaces_added_strv(sd_bus *bus, const char *path,
                                                  char **interfaces) = 0;
    virtual int sd_bus_emit_interfaces_removed_strv(sd_bus *bus,
                                                    const char *path,
                                                    char **interfaces) = 0;
    virtual int sd_bus_emit_object_added(sd_bus *bus, const char *path) = 0;
    virtual int sd_bus_emit_object_removed(sd_bus *bus, const char *path) = 0;
    virtual int sd_bus_emit_properties_changed_strv(sd_bus *bus,
                                                    const char *path,
                                                    const char *interface,
                                                    char **names) = 0;

    virtual int sd_bus_error_set_const(sd_bus_error *e, const char *name,
                                       const char *message) = 0;
    virtual int sd_bus_error_get_errno(const sd_bus_error *e) = 0;
    virtual int sd_bus_error_set_errno(sd_bus_error *e, int error) = 0;
    virtual int sd_bus_error_is_set(const sd_bus_error *e) = 0;
    virtual void sd_bus_error_free(sd_bus_error *e) = 0;

    virtual sd_event *sd_bus_get_event(sd_bus *bus) = 0;
    virtual int sd_bus_get_fd(sd_bus *bus) = 0;
    virtual int sd_bus_get_unique_name(sd_bus *bus, const char **unique) = 0;

    virtual int sd_bus_list_names(sd_bus *bus, char ***acquired,
                                  char ***activatable) = 0;

    // https://github.com/systemd/systemd/blob/master/src/systemd/sd-bus.h
    virtual int sd_bus_message_append_basic(sd_bus_message *message, char type,
                                            const void *value) = 0;

    virtual int sd_bus_message_at_end(sd_bus_message *m, int complete) = 0;

    virtual int sd_bus_message_close_container(sd_bus_message *m) = 0;

    virtual int sd_bus_message_enter_container(sd_bus_message *m, char type,
                                               const char *contents) = 0;

    virtual int sd_bus_message_exit_container(sd_bus_message *m) = 0;

    virtual sd_bus *sd_bus_message_get_bus(sd_bus_message *m) = 0;
    virtual int sd_bus_message_get_cookie(sd_bus_message *m,
                                          uint64_t *cookie) = 0;
    virtual const char *sd_bus_message_get_destination(sd_bus_message *m) = 0;
    virtual const char *sd_bus_message_get_interface(sd_bus_message *m) = 0;
    virtual const char *sd_bus_message_get_member(sd_bus_message *m) = 0;
    virtual const char *sd_bus_message_get_path(sd_bus_message *m) = 0;
    virtual const char *sd_bus_message_get_sender(sd_bus_message *m) = 0;
    virtual const char *sd_bus_message_get_signature(sd_bus_message *m,
                                                     int complete) = 0;
    virtual int sd_bus_message_get_errno(sd_bus_message *m) = 0;

    virtual int sd_bus_message_is_method_call(sd_bus_message *m,
                                              const char *interface,
                                              const char *member) = 0;
    virtual int sd_bus_message_is_method_error(sd_bus_message *m,
                                               const char *name) = 0;
    virtual int sd_bus_message_is_signal(sd_bus_message *m,
                                         const char *interface,
                                         const char *member) = 0;

    virtual int sd_bus_message_new_method_call(sd_bus *bus, sd_bus_message **m,
                                               const char *destination,
                                               const char *path,
                                               const char *interface,
                                               const char *member) = 0;

    virtual int sd_bus_message_new_method_return(sd_bus_message *call,
                                                 sd_bus_message **m) = 0;

    virtual int sd_bus_message_new_signal(sd_bus *bus, sd_bus_message **m,
                                          const char *path,
                                          const char *interface,
                                          const char *member) = 0;

    virtual int sd_bus_message_open_container(sd_bus_message *m, char type,
                                              const char *contents) = 0;

    virtual int sd_bus_message_read_basic(sd_bus_message *m, char type,
                                          void *p) = 0;

    virtual sd_bus_message *sd_bus_message_ref(sd_bus_message *m) = 0;

    virtual int sd_bus_message_skip(sd_bus_message *m, const char *types) = 0;

    virtual int sd_bus_message_verify_type(sd_bus_message *m, char type,
                                           const char *contents) = 0;

    virtual int sd_bus_process(sd_bus *bus, sd_bus_message **r) = 0;

    virtual sd_bus *sd_bus_ref(sd_bus *bus) = 0;

    virtual int sd_bus_request_name(sd_bus *bus, const char *name,
                                    uint64_t flags) = 0;

    virtual int sd_bus_send(sd_bus *bus, sd_bus_message *m,
                            uint64_t *cookie) = 0;

    virtual sd_bus *sd_bus_unref(sd_bus *bus) = 0;

    virtual int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) = 0;
};

class SdBusImpl : public SdBusInterface
{
  public:
    SdBusImpl() = default;
    ~SdBusImpl() = default;
    SdBusImpl(const SdBusImpl &) = default;
    SdBusImpl &operator=(const SdBusImpl &) = default;
    SdBusImpl(SdBusImpl &&) = default;
    SdBusImpl &operator=(SdBusImpl &&) = default;

    int sd_bus_add_object_manager(sd_bus *bus, sd_bus_slot **slot,
                                  const char *path) override
    {
        return ::sd_bus_add_object_manager(bus, slot, path);
    }

    int sd_bus_add_object_vtable(sd_bus *bus, sd_bus_slot **slot,
                                 const char *path, const char *interface,
                                 const sd_bus_vtable *vtable,
                                 void *userdata) override
    {
        return ::sd_bus_add_object_vtable(bus, slot, path, interface, vtable,
                                          userdata);
    }

    int sd_bus_attach_event(sd_bus *bus, sd_event *e, int priority) override
    {
        return ::sd_bus_attach_event(bus, e, priority);
    }

    int sd_bus_call(sd_bus *bus, sd_bus_message *m, uint64_t usec,
                    sd_bus_error *ret_error, sd_bus_message **reply) override
    {
        return ::sd_bus_call(bus, m, usec, ret_error, reply);
    }

    int sd_bus_detach_event(sd_bus *bus) override
    {
        return ::sd_bus_detach_event(bus);
    }

    int sd_bus_emit_interfaces_added_strv(sd_bus *bus, const char *path,
                                          char **interfaces) override
    {
        return ::sd_bus_emit_interfaces_added_strv(bus, path, interfaces);
    }

    int sd_bus_emit_interfaces_removed_strv(sd_bus *bus, const char *path,
                                            char **interfaces) override
    {
        return ::sd_bus_emit_interfaces_removed_strv(bus, path, interfaces);
    }

    int sd_bus_emit_object_added(sd_bus *bus, const char *path) override
    {
        return ::sd_bus_emit_object_added(bus, path);
    }

    int sd_bus_emit_object_removed(sd_bus *bus, const char *path) override
    {
        return ::sd_bus_emit_object_removed(bus, path);
    }

    int sd_bus_emit_properties_changed_strv(sd_bus *bus, const char *path,
                                            const char *interface,
                                            char **names) override
    {
        return ::sd_bus_emit_properties_changed_strv(bus, path, interface,
                                                     names);
    }

    int sd_bus_error_set_const(sd_bus_error *e, const char *name,
                               const char *message) override
    {
        return ::sd_bus_error_set_const(e, name, message);
    }

    int sd_bus_error_get_errno(const sd_bus_error *e) override
    {
        return ::sd_bus_error_get_errno(e);
    }

    int sd_bus_error_set_errno(sd_bus_error *e, int error) override
    {
        return ::sd_bus_error_set_errno(e, error);
    }

    int sd_bus_error_is_set(const sd_bus_error *e) override
    {
        return ::sd_bus_error_is_set(e);
    }

    void sd_bus_error_free(sd_bus_error *e) override
    {
        return ::sd_bus_error_free(e);
    }

    sd_event *sd_bus_get_event(sd_bus *bus) override
    {
        return ::sd_bus_get_event(bus);
    }

    int sd_bus_get_fd(sd_bus *bus) override
    {
        return ::sd_bus_get_fd(bus);
    }

    int sd_bus_get_unique_name(sd_bus *bus, const char **unique) override
    {
        return ::sd_bus_get_unique_name(bus, unique);
    }

    int sd_bus_list_names(sd_bus *bus, char ***acquired,
                          char ***activatable) override
    {
        return ::sd_bus_list_names(bus, acquired, activatable);
    }

    int sd_bus_message_append_basic(sd_bus_message *message, char type,
                                    const void *value) override
    {
        return ::sd_bus_message_append_basic(message, type, value);
    }

    int sd_bus_message_at_end(sd_bus_message *m, int complete) override
    {
        return ::sd_bus_message_at_end(m, complete);
    }

    int sd_bus_message_close_container(sd_bus_message *m) override
    {
        return ::sd_bus_message_close_container(m);
    }

    int sd_bus_message_enter_container(sd_bus_message *m, char type,
                                       const char *contents) override
    {
        return ::sd_bus_message_enter_container(m, type, contents);
    }

    int sd_bus_message_exit_container(sd_bus_message *m) override
    {
        return ::sd_bus_message_exit_container(m);
    }

    sd_bus *sd_bus_message_get_bus(sd_bus_message *m) override
    {
        return ::sd_bus_message_get_bus(m);
    }

    int sd_bus_message_get_cookie(sd_bus_message *m, uint64_t *cookie) override
    {
        return ::sd_bus_message_get_cookie(m, cookie);
    }

    const char *sd_bus_message_get_destination(sd_bus_message *m) override
    {
        return ::sd_bus_message_get_destination(m);
    }

    const char *sd_bus_message_get_interface(sd_bus_message *m) override
    {
        return ::sd_bus_message_get_interface(m);
    }

    const char *sd_bus_message_get_member(sd_bus_message *m) override
    {
        return ::sd_bus_message_get_member(m);
    }

    const char *sd_bus_message_get_path(sd_bus_message *m) override
    {
        return ::sd_bus_message_get_path(m);
    }

    const char *sd_bus_message_get_sender(sd_bus_message *m) override
    {
        return ::sd_bus_message_get_sender(m);
    }

    const char *sd_bus_message_get_signature(sd_bus_message *m,
                                             int complete) override
    {
        return ::sd_bus_message_get_signature(m, complete);
    }

    int sd_bus_message_get_errno(sd_bus_message *m) override
    {
        return ::sd_bus_message_get_errno(m);
    }

    int sd_bus_message_is_method_call(sd_bus_message *m, const char *interface,
                                      const char *member) override
    {
        return ::sd_bus_message_is_method_call(m, interface, member);
    }

    int sd_bus_message_is_method_error(sd_bus_message *m,
                                       const char *name) override
    {
        return ::sd_bus_message_is_method_error(m, name);
    }

    int sd_bus_message_is_signal(sd_bus_message *m, const char *interface,
                                 const char *member) override
    {
        return ::sd_bus_message_is_signal(m, interface, member);
    }

    int sd_bus_message_new_method_call(sd_bus *bus, sd_bus_message **m,
                                       const char *destination,
                                       const char *path, const char *interface,
                                       const char *member) override
    {
        return ::sd_bus_message_new_method_call(bus, m, destination, path,
                                                interface, member);
    }

    int sd_bus_message_new_method_return(sd_bus_message *call,
                                         sd_bus_message **m) override
    {
        return ::sd_bus_message_new_method_return(call, m);
    }

    int sd_bus_message_new_signal(sd_bus *bus, sd_bus_message **m,
                                  const char *path, const char *interface,
                                  const char *member) override
    {
        return ::sd_bus_message_new_signal(bus, m, path, interface, member);
    }

    int sd_bus_message_open_container(sd_bus_message *m, char type,
                                      const char *contents) override
    {
        return ::sd_bus_message_open_container(m, type, contents);
    }

    int sd_bus_message_read_basic(sd_bus_message *m, char type,
                                  void *p) override
    {
        return ::sd_bus_message_read_basic(m, type, p);
    }

    sd_bus_message *sd_bus_message_ref(sd_bus_message *m) override
    {
        return ::sd_bus_message_ref(m);
    }

    int sd_bus_message_skip(sd_bus_message *m, const char *types) override
    {
        return ::sd_bus_message_skip(m, types);
    }

    int sd_bus_message_verify_type(sd_bus_message *m, char type,
                                   const char *contents) override
    {
        return ::sd_bus_message_verify_type(m, type, contents);
    }

    int sd_bus_process(sd_bus *bus, sd_bus_message **r) override
    {
        return ::sd_bus_process(bus, r);
    }

    sd_bus *sd_bus_ref(sd_bus *bus) override
    {
        return ::sd_bus_ref(bus);
    }

    int sd_bus_request_name(sd_bus *bus, const char *name,
                            uint64_t flags) override
    {
        return ::sd_bus_request_name(bus, name, flags);
    }

    int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *cookie) override
    {
        return ::sd_bus_send(bus, m, cookie);
    }

    sd_bus *sd_bus_unref(sd_bus *bus) override
    {
        return ::sd_bus_unref(bus);
    }

    int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) override
    {
        return ::sd_bus_wait(bus, timeout_usec);
    }
};

extern SdBusImpl sdbus_impl;

} // namespace sdbusplus
