//
// Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
// SPDX-License-Identifier: MIT
//
#include <catch.hpp>
#include <opencv2/opencv.hpp>
#include "ObjectDetectionPipeline.hpp"
#include "Types.hpp"

static std::string GetResourceFilePath(const std::string& filename)
{
    std::string testResources = TEST_RESOURCE_DIR;
    if (0 == testResources.size())
    {
        throw "Invalid test resources directory provided";
    }
    else
    {
        if(testResources.back() != '/')
        {
            return testResources + "/" + filename;
        }
        else
        {
            return testResources + filename;
        }
    }
}

TEST_CASE("Test Network Execution SSD_MOBILE")
{
    std::string testResources = TEST_RESOURCE_DIR;
    REQUIRE(testResources != "");
    // Create the network options
    common::PipelineOptions options;
    options.m_ModelFilePath = GetResourceFilePath("detect.tflite");
    options.m_ModelName = "SSD_MOBILE";
    options.m_backends = {"CpuAcc", "CpuRef"};

    od::IPipelinePtr objectDetectionPipeline = od::CreatePipeline(options);

    common::InferenceResults<float> results;
    cv::Mat processed;
    cv::Mat inputFrame = cv::imread(GetResourceFilePath("basketball1.png"), cv::IMREAD_COLOR);
    cv::cvtColor(inputFrame, inputFrame, cv::COLOR_BGR2RGB);

    objectDetectionPipeline->PreProcessing(inputFrame, processed);

    CHECK(processed.type() == CV_8UC3);
    CHECK(processed.cols == 300);
    CHECK(processed.rows == 300);

    objectDetectionPipeline->Inference(processed, results);
    objectDetectionPipeline->PostProcessing(results,
                                            [](od::DetectedObjects detects) -> void {
                                                CHECK(detects.size() == 2);
                                                CHECK(detects[0].GetLabel() == "0");
                                            });

}
