#ifndef __DEVICEDISCOVERY_H__
#define __DEVICEDISCOVERY_H__

#include <memory>
#include <string>
#include <system_error>
#include <vector>
#ifdef WIN32
#include <mfidl.h>
#include <mfreadwrite.h>
#endif

class DeviceDiscovery {
    constexpr static int32_t OtaSpecificWidth = 96;

public:
    constexpr static auto DeviceName = "UVC Camera";
    struct Device {
        ~Device();
#ifdef WIN32
        Device(IMFMediaSource *source);
        IMFMediaSource *source = nullptr;
        IMFSourceReader *reader = nullptr;
#else
        std::string name;
#endif
    };

    using Resolution = std::pair<int32_t, int32_t>;
    using Resolutions = std::vector<Resolution>;
    DeviceDiscovery();
    std::shared_ptr<Device> find(const std::string &deviceName, std::error_code &error);
    void enterOtaMode(const std::shared_ptr<Device> &device, std::error_code &error);
    std::vector<std::string> devices();

protected:
    Resolutions deviceResolutions(const std::shared_ptr<Device> &source);
};
#endif // __DEVICEDISCOVERY_H__