//
// Copyright © 2017 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//

#include "TestDynamicBackend.hpp"

#include <armnn/backends/IBackendInternal.hpp>

#include <boost/core/ignore_unused.hpp>

constexpr const char* TestDynamicBackendId()
{
#if defined(VALID_TEST_DYNAMIC_BACKEND_1)

    return "ValidTestDynamicBackend";

#elif defined(VALID_TEST_DYNAMIC_BACKEND_2) || \
      defined(VALID_TEST_DYNAMIC_BACKEND_4) || \
      defined(INVALID_TEST_DYNAMIC_BACKEND_9)

    // This backend id is shared among different test dynamic backends for testing purposes:
    // the test dynamic backend 4 is actually a duplicate of the test dynamic backend 2 (with the same version),
    // the test dynamic backend 9 is actually a duplicate of the test dynamic backend 2 (but with a version
    // incompatible with the current Backend API)
    return "TestValid2";

#elif defined(VALID_TEST_DYNAMIC_BACKEND_3)

    // The test dynamic backend 3 is a different backend than the test dynamic backend 2
    return "TestValid3";

#elif defined(VALID_TEST_DYNAMIC_BACKEND_5)

    // The test dynamic backend 5 is a different backend than the test dynamic backend 2
    return "TestValid5";

#elif defined(INVALID_TEST_DYNAMIC_BACKEND_10)

    // Empty backend id
    return "";

#elif defined(INVALID_TEST_DYNAMIC_BACKEND_11)

    // "Unknown" backend id, "Unknown" is a reserved id in ArmNN
    return "Unknown";

#else

    return "InvalidTestDynamicBackend";

#endif
}

class TestDynamicBackend : public armnn::IBackendInternal
{
public:
    TestDynamicBackend()
        : m_BackendId(TestDynamicBackendId())
    {}

    const armnn::BackendId& GetId() const override
    {
        return m_BackendId;
    }
    IWorkloadFactoryPtr CreateWorkloadFactory(const IMemoryManagerSharedPtr& memoryManager) const override
    {
        boost::ignore_unused(memoryManager);
        return IWorkloadFactoryPtr{};
    }
    ILayerSupportSharedPtr GetLayerSupport() const override
    {
        return ILayerSupportSharedPtr{};
    }

private:
    armnn::BackendId m_BackendId;
};

const char* GetBackendId()
{
#if defined(INVALID_TEST_DYNAMIC_BACKEND_5) || \
    defined(INVALID_TEST_DYNAMIC_BACKEND_8)

    // Return an invalid backend id
    return nullptr;

#else

    // Return a valid backend id
    return TestDynamicBackendId();

#endif
}

void GetVersion(uint32_t* outMajor, uint32_t* outMinor)
{
    if (!outMajor || !outMinor)
    {
        return;
    }

#if defined(INVALID_TEST_DYNAMIC_BACKEND_7) || \
    defined(INVALID_TEST_DYNAMIC_BACKEND_8)

    *outMajor = 0;
    *outMinor = 7;

#else

    armnn::BackendVersion apiVersion = armnn::IBackendInternal::GetApiVersion();

    *outMajor = apiVersion.m_Major;

#if defined(INVALID_TEST_DYNAMIC_BACKEND_9)

    *outMinor = apiVersion.m_Minor + 1;

#else

    *outMinor = apiVersion.m_Minor;

#endif

#endif
}

void* BackendFactory()
{
#if defined(INVALID_TEST_DYNAMIC_BACKEND_6)

    // Return an invalid backend instance
    return nullptr;

#else

    // Return a non-null backend instance
    return new TestDynamicBackend();

#endif
}
