#pragma once

#include <iostream>
#include <future>
#include <thread>

#include <opencv2/opencv.hpp>

#include <input.h>
#include <processing.h>
#include <control_module.h>
#include <interpreter.h>
#include <intersection_handler.h>


using namespace cv;

class LFR
{
    Input input;
    Processing processing;
    ControlModule controlModule;
    Interpreter interpreter;
    IntersectionHandler intersectionHandler;
    volatile bool iAmLooping;
    void loop();
    thread loopThread;
    int thresholdBinary;
    int gaussKernelSize;
    int thresholdCanny1;
    int thresholdCanny2;
    int apertureSizeCanny;

    void provideOutput(Mat image,const FrameData& frameData, const Rect& roi);

public:

    LFR() = delete;
    LFR(int videoHeight, int videoWidth, int thresholdBinary, int gaussKernelSize, int thresholdCanny1, int thresholdCanny2, int apertureSizeCanny);
    ~LFR();

    void startLoop();
    void endLoop();

    
    bool videoFlag;
    bool saveOutputFlag;

    std::string outputFileName;
    
};