#pragma once
#include "ModuleHook.h"
namespace NosSmoothCore
{
	public delegate bool NetworkCallback(System::String^ packet);
	typedef bool(__stdcall* PacketCallback)(const char* packet);
	class NetworkUnmanaged
	{
	public:
		void Setup(NosSmoothCore::ModuleHook moduleHook);
		/// 
		/// Send the given packet to the server.
		/// 
		/// The packed to send.
		void SendPacket(const char * packet);
		/// 
		/// Receive the given packet on the client.
		/// 
		/// The packet to receive.
		void ReceivePacket(const char * packet);
		/// 
		/// Sets the receive callback delegate to be called when packet is received.
		/// 
		/// 
		void SetReceiveCallback(PacketCallback callback);
		/// 
		/// Sets the send callback delegate to be called when the packet is sent.
		/// 
		/// 
		void SetSendCallback(PacketCallback callback);
		/// 
		/// Resets all the function hooks.
		/// 
		void ResetHooks();
		bool ExecuteSendCallback(const char *packet);
		bool ExecuteReceiveCallback(const char *packet);
		static NetworkUnmanaged* GetInstance()
		{
			static NetworkUnmanaged instance;
			return reinterpret_cast(&instance);
		}
	private:
		NetworkUnmanaged();
		unsigned int _callerObject;
		unsigned int _receivePacketAddress;
		unsigned int _sendPacketAddress;
		PacketCallback _sendCallback;
		PacketCallback _receiveCallback;
	};
}