//
// Copyright © 2017 Arm Ltd. All rights reserved.
// See LICENSE file in the project root for full license information.
//

#pragma once

#include <HalInterfaces.h>

#include "DriverOptions.hpp"

#include <armnn/ArmNN.hpp>

namespace armnn_driver
{

struct HalVersion_1_0
{
    using Model = ::android::hardware::neuralnetworks::V1_0::Model;
    using Capabilities = ::android::hardware::neuralnetworks::V1_0::Capabilities;
    using getCapabilities_cb = ::android::hardware::neuralnetworks::V1_0::IDevice::getCapabilities_cb;
    using getSupportedOperations_cb = ::android::hardware::neuralnetworks::V1_0::IDevice::getSupportedOperations_cb;
};

#if defined(ARMNN_ANDROID_NN_V1_1)
struct HalVersion_1_1
{
    using Model = ::android::hardware::neuralnetworks::V1_1::Model;
    using Capabilities = ::android::hardware::neuralnetworks::V1_1::Capabilities;
    using getCapabilities_cb = ::android::hardware::neuralnetworks::V1_1::IDevice::getCapabilities_1_1_cb;
    using getSupportedOperations_cb = ::android::hardware::neuralnetworks::V1_1::IDevice::getSupportedOperations_1_1_cb;
};
#endif

template <typename HalVersion>
class ArmnnDriverImpl
{
public:
    using HalModel = typename HalVersion::Model;
    using HalCapabilities = typename HalVersion::Capabilities;
    using HalGetCapabilities_cb = typename HalVersion::getCapabilities_cb;
    using HalGetSupportedOperations_cb = typename HalVersion::getSupportedOperations_cb;

    static Return<void> getCapabilities(
            const armnn::IRuntimePtr& runtime,
            HalGetCapabilities_cb cb);
    static Return<void> getSupportedOperations(
            const armnn::IRuntimePtr& runtime,
            const DriverOptions& options,
            const HalModel& model,
            HalGetSupportedOperations_cb);
    static Return<ErrorStatus> prepareModel(
            const armnn::IRuntimePtr& runtime,
            const armnn::IGpuAccTunedParametersPtr& clTunedParameters,
            const DriverOptions& options,
            const HalModel& model,
            const android::sp<IPreparedModelCallback>& cb,
            bool float32ToFloat16 = false);
    static Return<DeviceStatus> getStatus();
};

} // namespace armnn_driver
