#pragma once
#include "callback.h"
enum class DataChannelState : std::int32_t {
	kConnecting = 0,
	kOpen = 1,
	kClosing = 2,
	kClosed = 3
};
using DataChannelMessageCallback = Callback<const void*, const int32_t>;
using DataChannelBufferingCallback =
Callback<const uint64_t, const uint64_t, const uint64_t>;

/// Callback fired when the data channel state changed.
using DataChannelStateCallback = Callback</*DataChannelState*/ int, int>;

class DataChannelObserver : public webrtc::DataChannelObserver {
public:
	DataChannelObserver(
		rtc::scoped_refptr<webrtc::DataChannelInterface> data_channel) ;
	webrtc::DataChannelInterface* data_channel() const {
		return data_channel_.get();
	}
	void SetMessageCallback(DataChannelMessageCallback callback)  {
		std::lock_guard<std::mutex> lock(mutex_);
		message_callback_ = callback;
	}
	void SetBufferingCallback(
		DataChannelBufferingCallback callback)  {
		std::lock_guard<std::mutex> lock(mutex_);
		buffering_callback_ = callback;
	}
	void SetStateCallback(DataChannelStateCallback callback)  {
		std::lock_guard<std::mutex> lock(mutex_);
		state_callback_ = callback;
	}

protected:
	// DataChannelObserver interface

	// The data channel state have changed.
	void OnStateChange()  override;
	//  A data buffer was successfully received.
	void OnMessage(const webrtc::DataBuffer& buffer)  override;
	// The data channel's buffered_amount has changed.
	void OnBufferedAmountChange(uint64_t previous_amount)  override;

private:
	rtc::scoped_refptr<webrtc::DataChannelInterface> data_channel_;
	DataChannelMessageCallback message_callback_;
	DataChannelBufferingCallback buffering_callback_;
	DataChannelStateCallback state_callback_;
	std::mutex mutex_;
};