//
// Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
// SPDX-License-Identifier: MIT
//
#pragma once


#include "IFrameReader.hpp"
#include <opencv2/opencv.hpp>

namespace od
{

class CvVideoFrameReader :
    public IFrameReader<cv::Mat>
{
public:
    /**
     * @brief Default constructor.
     *
     * Underlying open cv video capture object will be instantiated.
     */
    CvVideoFrameReader() = default;

    ~CvVideoFrameReader() override = default;

    /**
     *@brief Initialises reader to capture frames from video file.
     *
     * @param source path to the video file or image sequence.
     *
     * @throws std::runtime_error if init failed
     */
    void Init(const std::string& source);

    std::shared_ptr <cv::Mat> ReadFrame() override;

    bool IsExhausted(const std::shared_ptr <cv::Mat>& frame) const override;

    /**
     * Returns effective video frame width supported by the source/set by the user.
     * Must be called after Init method.
     * @return frame width
     */
    int GetSourceWidth() const;

    /**
     * Returns effective video frame height supported by the source/set by the user.
     * Must be called after Init method.
     * @return frame height
     */
    int GetSourceHeight() const;

    /**
     * Returns effective fps value supported by the source/set by the user.
     * @return fps value
     */
    double GetSourceFps() const;

    /**
     * Will query OpenCV to convert images to RGB
     * Copy is actually default behaviour, but the set function needs to be called
     * in order to know whether OpenCV supports conversion from our source format.
     * @return boolean,
     *     true:  OpenCV returns RGB
     *     false: OpenCV returns the fourcc format from GetSourceEncoding
     */
    bool ConvertToRGB();

    /**
     * Returns 4-character code of codec.
     * @return codec name
     */
    std::string GetSourceEncoding() const;

   /**
    * Get the fourcc int from its string name.
    * @return codec int
    */
    int GetSourceEncodingInt() const;

    int GetFrameCount() const;

private:
    cv::VideoCapture m_capture;

    void CheckIsOpen(const std::string& source);
};

class CvVideoFrameReaderRgbWrapper :
        public IFrameReader<cv::Mat>
{
public:
    CvVideoFrameReaderRgbWrapper() = delete;
    CvVideoFrameReaderRgbWrapper(const CvVideoFrameReaderRgbWrapper& o) = delete;
    CvVideoFrameReaderRgbWrapper(CvVideoFrameReaderRgbWrapper&& o) = delete;

    CvVideoFrameReaderRgbWrapper(std::unique_ptr<od::CvVideoFrameReader> reader);

    std::shared_ptr<cv::Mat> ReadFrame() override;

    bool IsExhausted(const std::shared_ptr<cv::Mat>& frame) const override;

private:
    std::unique_ptr<od::CvVideoFrameReader> m_reader;
};

}// namespace od