// Copyright (c) 2012-2017 VideoStitch SAS
// Copyright (c) 2018 stitchEm

#pragma once

#include "libvideostitch/inputFactory.hpp"
#include "libvideostitch/plugin.hpp"
#include <vector>

namespace VideoStitch {
namespace Plugin {

class PortAudioDiscovery : public VSDiscoveryPlugin {
 public:
  static PortAudioDiscovery* create();
  virtual ~PortAudioDiscovery() {}

  std::string name() const override;
  std::string readableName() const override;
  std::vector<Plugin::DiscoveryDevice> inputDevices() override;
  std::vector<Plugin::DiscoveryDevice> outputDevices() override;
  std::vector<std::string> cards() const override;
  void registerAutoDetectionCallback(AutoDetection&) override;
  std::vector<DisplayMode> supportedDisplayModes(const Plugin::DiscoveryDevice&) override;
  DisplayMode currentDisplayMode(const Plugin::DiscoveryDevice&) override;
  std::vector<PixelFormat> supportedPixelFormat(const Plugin::DiscoveryDevice&) override;
  std::vector<int> supportedNbChannels(const Plugin::DiscoveryDevice& device) override;
  std::vector<Audio::SamplingRate> supportedSamplingRates(const Plugin::DiscoveryDevice& device) override;
  std::vector<Audio::SamplingDepth> supportedSampleFormats(const Plugin::DiscoveryDevice& device) override;

 private:
  PortAudioDiscovery();

  void filterWindowsDevices();
  void removeDevice(size_t index);
  std::vector<std::string> _devNames;

  std::map<std::string, int> _devMaxInputsChannel;
  std::map<std::string, int> _devMaxOutputsChannel;
  std::map<std::string, std::vector<int>> _devChannelCounts;
  std::map<std::string, std::vector<Audio::SamplingRate>> _devSampleRates;
  std::map<std::string, std::vector<Audio::SamplingDepth>> _devSampleDepths;
};

}  // namespace Plugin
}  // namespace VideoStitch