#ifndef AUTOTESTS_SYSTEM_SETTING_STUB_QDBUSREPLY
#define AUTOTESTS_SYSTEM_SETTING_STUB_QDBUSREPLY

#include <QObject>
#include <QString>

class QDBusConnection
{
public:
    static QDBusConnection sessionBus()
    {
        return QDBusConnection();
    }
};

template<typename T>
class QDBusReply
{
public:
    QDBusReply() = default;

    explicit QDBusReply(const T &value, bool valid = true)
        : m_value(value),
          m_valid(valid)
    {
    }

    bool isValid() const
    {
        return m_valid;
    }

    T value() const
    {
        return m_value;
    }

    operator T() const
    {
        return m_value;
    }

private:
    T m_value {};
    bool m_valid = false;
};

class QDBusInterface : public QObject
{
public:
    QDBusInterface(const QString &service,
                   const QString &path,
                   const QString &interface,
                   const QDBusConnection &connection,
                   QObject *parent = nullptr)
        : QObject(parent),
          m_service(service),
          m_path(path),
          m_interface(interface)
    {
        Q_UNUSED(connection)
        ++s_createdCount;
    }

    bool isValid() const
    {
        return s_nextValid;
    }

    QDBusReply<bool> call(const QString &method, const QString &desktopFile)
    {
        ++s_callCount;
        s_lastMethod = method;
        s_lastDesktopFile = desktopFile;
        return QDBusReply<bool>(s_nextReplyValue, s_nextReplyValid);
    }

    static void resetTestData()
    {
        s_nextValid = true;
        s_nextReplyValid = true;
        s_nextReplyValue = true;
        s_createdCount = 0;
        s_callCount = 0;
        s_lastMethod.clear();
        s_lastDesktopFile.clear();
    }

    static void setNextValid(bool valid)
    {
        s_nextValid = valid;
    }

    static void setNextReply(bool value, bool valid = true)
    {
        s_nextReplyValue = value;
        s_nextReplyValid = valid;
    }

    static int createdCount()
    {
        return s_createdCount;
    }

    static int callCount()
    {
        return s_callCount;
    }

    static QString lastMethod()
    {
        return s_lastMethod;
    }

    static QString lastDesktopFile()
    {
        return s_lastDesktopFile;
    }

private:
    QString m_service;
    QString m_path;
    QString m_interface;
    inline static bool s_nextValid = true;
    inline static bool s_nextReplyValid = true;
    inline static bool s_nextReplyValue = true;
    inline static int s_createdCount = 0;
    inline static int s_callCount = 0;
    inline static QString s_lastMethod;
    inline static QString s_lastDesktopFile;
};

#endif
