#pragma once

#include <string>
#include <vector>
#include <utility> // std::pair
#include <memory> // std::shared_ptr
#include <opencv2/opencv.hpp> // all opencv header
#include <libraw/libraw.h>

namespace hdrplus
{

    class MemFile
    {
    public:
        std::vector<uint8_t> content;

        const std::vector<uint8_t> GetConstData() const
        {
            return content;
        }

        std::vector<uint8_t> GetData()
        {
            return content;
        }
    };

class bayer_image
{
    public:
        explicit bayer_image( const std::string& bayer_image_path );
        explicit bayer_image( const std::vector<uint8_t>& bayer_image_content );
        explicit bayer_image( std::shared_ptr<MemFile> bayer_image_file );

        ~bayer_image() = default;

        std::pair<double, double> get_noise_params() const;

        std::shared_ptr<LibRaw> libraw_processor;
        cv::Mat raw_image;
        cv::Mat grayscale_image;
        int width;
        int height;
        int white_level;
        std::vector<int> black_level_per_channel;
        float iso;

    private:
        float baseline_lambda_shot = 3.24 * pow( 10, -4 );
        float baseline_lambda_read = 4.3 * pow( 10, -6 );
};

} // namespace hdrplus
