/*
    SPDX-FileCopyrightText: 2020 Volker Krause <vkrause@kde.org>

    SPDX-License-Identifier: LGPL-2.0-or-later
*/

#ifndef FAKE_QANDROIDJNIOBJECT_H
#define FAKE_QANDROIDJNIOBJECT_H

#include "kandroidextras_export.h"
#include "jni.h"

#include <kandroidextras/jnisignature.h>
#include <kandroidextras/jnitypes.h>

#include <QStringList>

/** Mock object for QAndroidJniObject outside of Android, for automated testing. */
class KANDROIDEXTRAS_EXPORT QAndroidJniObject {
public:
    QAndroidJniObject() = default;

    QAndroidJniObject(const char *className)
    {
        m_protocol.push_back(QLatin1String("ctor: ") + QLatin1String(className));
    }
    QAndroidJniObject(const char *className, const char *signature, ...)
    {
        m_protocol.push_back(QLatin1String("ctor: ") + QLatin1String(className) + QLatin1Char(' ') + QLatin1String(signature));
    }

    bool isValid() const { return true; }

    static QAndroidJniObject fromString(const QString &s) { Q_UNUSED(s); return {}; }
    static QAndroidJniObject fromLocalRef(jobject o)
    {
        QAndroidJniObject obj;
        obj.m_protocol.push_back(QLatin1String("ctor: ") + QString::number((qulonglong)o));
        return obj;
    }
    QString toString() const { return m_protocol.join(QLatin1Char('\n')); }

    jobject object() const { return nullptr; }
    template <typename T>
    T object() const { return {}; }

    template <typename T>
    T callMethod(const char *methodName, const char *signature, ...) const
    {
        m_protocol.push_back(QLatin1String("callMethod: ") + QLatin1String(methodName) + QLatin1Char(' ') + QLatin1String(signature));
        return {};
    }

    QAndroidJniObject callObjectMethod(const char *methodName, const char *signature, ...) const
    {
        QAndroidJniObject obj;
        obj.m_protocol = m_protocol;
        obj.m_protocol.push_back(QLatin1String("callObjectMethod: ") + QLatin1String(methodName) + QLatin1Char(' ') + QLatin1String(signature));
        return obj;
    }

    static QAndroidJniObject callStaticObjectMethod(const char *methodName, const char *signature, ...)
    {
        QAndroidJniObject obj;
        obj.m_protocol.push_back(QLatin1String("callStaticObjectMethod: ") + QLatin1String(methodName) + QLatin1Char(' ') + QLatin1String(signature));
        return obj;
    }

    static QAndroidJniObject getStaticObjectField(const char *className, const char *fieldName, const char *signature)
    {
        m_staticProtocol.push_back(QLatin1String("getStaticObjectField: ") + QLatin1String(className) + QLatin1Char(' ') + QLatin1String(fieldName) + QLatin1Char(' ') + QLatin1String(signature));
        return {};
    }

    template <typename T>
    static QAndroidJniObject getStaticObjectField(const char *className, const char *fieldName)
    {
        m_staticProtocol.push_back(QLatin1String("getStaticObjectField<>: ") + QLatin1String(className) + QLatin1Char(' ') + QLatin1String(fieldName));
        return {};
    }

    template <typename T>
    static T getStaticField(const char *className, const char *fieldName)
    {
        m_staticProtocol.push_back(QLatin1String("getStaticField<>: ") + QLatin1String(className) + QLatin1Char(' ') + QLatin1String(fieldName) + QLatin1Char(' ') + QLatin1String(KAndroidExtras::Jni::signature<T>()));
        return {};
    }

    mutable QStringList m_protocol;
    static QStringList m_staticProtocol;
};

#endif
