#ifndef AUTOTESTS_BLUETOOTH_CONNECTOR_STUB_QDBUSINTERFACE
#define AUTOTESTS_BLUETOOTH_CONNECTOR_STUB_QDBUSINTERFACE

#include <QObject>
#include <QQueue>
#include <QString>

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

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;
        m_valid = s_validitySequence.isEmpty() ? s_defaultValidity : s_validitySequence.dequeue();
    }

    ~QDBusInterface() override
    {
        ++s_destroyedCount;
    }

    bool isValid() const
    {
        return m_valid;
    }

    QString service() const
    {
        return m_service;
    }

    QString path() const
    {
        return m_path;
    }

    QString interface() const
    {
        return m_interface;
    }

    static void resetTestData()
    {
        s_validitySequence.clear();
        s_defaultValidity = false;
        s_createdCount = 0;
        s_destroyedCount = 0;
    }

    static void setDefaultValidity(bool valid)
    {
        s_defaultValidity = valid;
    }

    static void setValiditySequence(const QList<bool> &sequence)
    {
        s_validitySequence.clear();
        for (bool valid : sequence) {
            s_validitySequence.enqueue(valid);
        }
    }

    static int createdCount()
    {
        return s_createdCount;
    }

    static int destroyedCount()
    {
        return s_destroyedCount;
    }

private:
    bool m_valid = false;
    QString m_service;
    QString m_path;
    QString m_interface;
    inline static QQueue<bool> s_validitySequence;
    inline static bool s_defaultValidity = false;
    inline static int s_createdCount = 0;
    inline static int s_destroyedCount = 0;
    inline static QString s_lastService;
    inline static QString s_lastPath;
    inline static QString s_lastInterface;
};

#endif
