//===========================================================================//
//
// Purpose: 
//
//===========================================================================//
#pragma once
#include "protoc/cl_rcon.pb.h"
#include "protoc/sv_rcon.pb.h"

constexpr const char* NETCON_VERSION = "2.0.0.1";

class CNetCon
{
public:
	CNetCon(void);
	~CNetCon(void);

	bool Init(void);
	bool Shutdown(void);

	void TermSetup(void);
	void UserInput(void);

	void RunFrame(void);
	bool ShouldQuit(void) const;

	bool Connect(const std::string& svInAdr, const std::string& svInPort);
	void Disconnect(void);

	void Send(const std::string& svMessage) const;
	void Recv(void);

	void ProcessBuffer(const char* pRecvBuf, int nRecvLen, CConnectedNetConsoleData* pData);
	void ProcessMessage(const sv_rcon::response& sv_response) const;

	std::string Serialize(const std::string& svReqBuf, const std::string& svReqVal, const cl_rcon::request_t request_t) const;
	sv_rcon::response Deserialize(const std::string& svBuf) const;

private:
	bool m_bInitialized;
	bool m_bNoColor;
	bool m_bQuitApplication;
	std::atomic<bool> m_abPromptConnect;
	std::atomic<bool> m_abConnEstablished;

	CNetAdr2 m_NetAdr2;
	CSocketCreator m_Socket;

	mutable std::mutex m_Mutex;
};

//-----------------------------------------------------------------------------
// singleton
//-----------------------------------------------------------------------------
extern CNetCon* NetConsole();