#ifndef ICEREMOTECANDIDATE_H
#define ICEREMOTECANDIDATE_H

#include <string>
#include <optional>

#include "config.h"
#include "IpAddress.h"
#include "PacketHeader.h"
#include "SocketAddress.h"

class ICERemoteCandidate : public SocketAddress
{
public:
	enum State
	{
		Initial,
		Checking,
		Connected,
		TimedOut
	};
	class Listener
	{
	public:
		virtual int onData(const ICERemoteCandidate* candidate,const BYTE* data,DWORD size) = 0;
	};
public:
	ICERemoteCandidate(const SocketAddress& address, std::shared_ptr<Listener> listener, std::string username) :
		SocketAddress(address),
		listener(listener),
		username(username)
	{
	}

	ICERemoteCandidate(const IpAddress& ipAddress, const uint16_t port,std::shared_ptr<Listener> listener,std::string username) :
		SocketAddress(ipAddress, port),
		listener(listener),
		username(username)
	{
	}
	
	int onData(const BYTE* data, DWORD size)
	{
		return listener->onData(this,data,size);
	}
	void SetState(State state) 
	{
		this->state = state;
	}
	void SetRawTxData(const PacketHeader::FlowRoutingInfo& data)
	{
		this->rawTxData = std::optional(data);
	}
	
	State		GetState()		const { return state;		}
	std::string	GetUsername()		const { return username;	}
	const std::optional<PacketHeader::FlowRoutingInfo>& GetRawTxData() const { return rawTxData; }

	std::string GetRemoteAddress() { return ToString(); }
	
private:
	State state = Initial;
	std::shared_ptr<Listener> listener;
	std::string username;
	std::optional<PacketHeader::FlowRoutingInfo> rawTxData;
};


#endif /* ICEREMOTECANDIDATE_H */

