#pragma once

#include "ehs/EHS.h"
#include "BaseAudioDevice.h"

#include <initguid.h>
#include <mmdeviceapi.h>
#include <functiondiscoverykeys_devpkey.h>
#include <Audioclient.h>

struct IMMDevice;

namespace ehs
{
	class EHS_LIB_IO AudioDevice final : public BaseAudioDevice
	{
	private:
		IMMDevice* hdl;
		IAudioClient* client;
		IAudioRenderClient* playbackClient;
		IAudioCaptureClient* captureClient;

	public:
		~AudioDevice() override;

		AudioDevice();

		AudioDevice(AudioDevice&& device) noexcept;

		AudioDevice(const AudioDevice& device);

		AudioDevice& operator=(AudioDevice&& device) noexcept;

		AudioDevice& operator=(const AudioDevice& device);

		void OpenStream() override;

		void CloseStream() override;

		UInt_64 SendStream(const void *data, UInt_64 outFrameSize) override;

		UInt_64 ReceiveStream(void *data, UInt_64 inFrameSize) override;

		Str_32 GetInterfaceName_32() const;

		Str_16 GetInterfaceName_16() const;

		Str_8 GetInterfaceName_8() const;

		Str_32 GetName_32() const;

		Str_16 GetName_16() const;

		Str_8 GetName_8() const;

        bool IsStreaming() const override;

		bool IsValid() const override;

		static AudioDevice GetDefault(AudioDeviceType type);

		static Array<AudioDevice> Get(AudioDeviceType type, AudioDeviceState state);
	};
}