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

#pragma once

#include <cstddef>
#include <string>
#include <map>
#include <vector>
#include <boost/variant/apply_visitor.hpp>
#include <iostream>
#include <armnn/Types.hpp>
#include <functional>
#include <algorithm>

namespace armnnUtils
{

using namespace armnn;

class ModelAccuracyChecker
{
public:
    ModelAccuracyChecker(const std::map<std::string, int>& validationLabelSet);

    float GetAccuracy(unsigned int k);

    template<typename TContainer>
    void AddImageResult(const std::string& imageName, std::vector<TContainer> outputTensor)
    {
        // Increment the total number of images processed
        ++m_ImagesProcessed;

        std::map<int, float> confidenceMap;
        auto & output = outputTensor[0];

        // Create a map of all predictions
        boost::apply_visitor([&](auto && value)
                             {
                                 int index = 0;
                                 for (const auto & o : value)
                                 {
                                     if (o > 0)
                                     {
                                         confidenceMap.insert(std::pair<int, float>(index, static_cast<float>(o)));
                                     }
                                     ++index;
                                 }
                             },
                             output);

        // Create a comparator for sorting the map in order of highest probability
        typedef std::function<bool(std::pair<int, float>, std::pair<int, float>)> Comparator;

        Comparator compFunctor =
            [](std::pair<int, float> element1, std::pair<int, float> element2)
            {
                return element1.second > element2.second;
            };

        // Do the sorting and store in an ordered set
        std::set<std::pair<int, float>, Comparator> setOfPredictions(
            confidenceMap.begin(), confidenceMap.end(), compFunctor);

        std::string trimmedName = GetTrimmedImageName(imageName);
        int value = m_GroundTruthLabelSet.find(trimmedName)->second;

        unsigned int index = 1;
        for (std::pair<int, float> element : setOfPredictions)
        {
            if(element.first == value)
            {
                ++m_TopK[index];
            } else
            {
                ++index;
            }
        }
    }

    std::string GetTrimmedImageName(const std::string& imageName) const
    {
        std::string trimmedName;
        size_t lastindex = imageName.find_last_of(".");
        if(lastindex != std::string::npos)
        {
            trimmedName = imageName.substr(0, lastindex);
        } else
        {
            trimmedName = imageName;
        }
        return trimmedName;
    }

private:
    const std::map<std::string, int> m_GroundTruthLabelSet;
    std::vector<unsigned int> m_TopK = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    unsigned int m_ImagesProcessed = 0;
};
} //namespace armnnUtils

