#pragma once

#include "fgc/Config.h"
#include "fgc/ICameraSource.h"

#include <memory>

namespace fgc {

// Real camera source backed by the Allied Vision Vimba X SDK (VmbCPP). Opens the
// cameras in CameraConfig, applies the on-camera imaging settings in-session, runs a
// PACED FREE-RUN stream (fixed low frame rate, no software trigger - large frames
// streamed fast stall this USB3 host), and keeps the latest complete frame; trigger()
// delivers it to the callback once per waypoint. Encode/save lives in ImagePipeline.
class VimbaCameraSource : public ICameraSource {
public:
    explicit VimbaCameraSource(CameraConfig config);
    ~VimbaCameraSource() override;

    void open() override;
    void close() override;
    void start() override;
    void stop() override;
    bool trigger() override;
    bool setFrameRate(double fps) override;
    void setFrameCallback(FrameCallback cb) override;
    int  cameraCount() const override;
    std::vector<CameraDeviceInfo> deviceInfo() override;

private:
    struct Impl;
    std::unique_ptr<Impl> impl_;
};

}  // namespace fgc
