/*
 * Copyright (c) 2022 Arm Limited. All rights reserved.
 * SPDX-License-Identifier: Apache-2.0
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef VWW_PROCESSING_HPP
#define VWW_PROCESSING_HPP

#include "BaseProcessing.hpp"
#include "Model.hpp"
#include "Classifier.hpp"

namespace arm {
namespace app {

    /**
     * @brief   Pre-processing class for Visual Wake Word use case.
     *          Implements methods declared by BasePreProcess and anything else needed
     *          to populate input tensors ready for inference.
     */
    class VisualWakeWordPreProcess : public BasePreProcess {

    public:
        /**
         * @brief       Constructor
         * @param[in]   inputTensor   Pointer to the TFLite Micro input Tensor.
         **/
        explicit VisualWakeWordPreProcess(TfLiteTensor* inputTensor);

        /**
         * @brief       Should perform pre-processing of 'raw' input image data and load it into
         *              TFLite Micro input tensors ready for inference
         * @param[in]   input      Pointer to the data that pre-processing will work on.
         * @param[in]   inputSize  Size of the input data.
         * @return      true if successful, false otherwise.
         **/
        bool DoPreProcess(const void* input, size_t inputSize) override;

    private:
        TfLiteTensor* m_inputTensor;
    };

    /**
     * @brief   Post-processing class for Visual Wake Word use case.
     *          Implements methods declared by BasePostProcess and anything else needed
     *          to populate result vector.
     */
    class VisualWakeWordPostProcess : public BasePostProcess {

    private:
        TfLiteTensor* m_outputTensor;
        Classifier& m_vwwClassifier;
        const std::vector<std::string>& m_labels;
        std::vector<ClassificationResult>& m_results;

    public:
        /**
         * @brief       Constructor
         * @param[in]   outputTensor   Pointer to the TFLite Micro output Tensor.
         * @param[in]   classifier     Classifier object used to get top N results from classification.
         * @param[in]   model          Pointer to the VWW classification Model object.
         * @param[in]   labels         Vector of string labels to identify each output of the model.
         * @param[out]  results        Vector of classification results to store decoded outputs.
         **/
        VisualWakeWordPostProcess(TfLiteTensor* outputTensor, Classifier& classifier,
                const std::vector<std::string>& labels,
                std::vector<ClassificationResult>& results);

        /**
         * @brief    Should perform post-processing of the result of inference then
         *           populate classification result data for any later use.
         * @return   true if successful, false otherwise.
         **/
        bool DoPostProcess() override;
    };

} /* namespace app */
} /* namespace arm */

#endif /* VWW_PROCESSING_HPP */