#pragma once

#include "CoreMinimal.h"
#include "LockedWrapper.h"
#include <string>

// Class FlxSockets
//
// This class is responsible for creating outgoing and incoming
// sockets for the Luprex engine.  It then relays data into and out
// of the Luprex engine.
//
// It only has one interesting method: Update().  This one method
// does all the communication for the Luprex engine.  Note that
// there aren't any methods where Unreal can query the state
// of the FlxSockets.  That's because this class is for
// communication between Luprex and outside servers and clients,
// NOT for communication with Unreal.
//
// The FlxSockets keeps a pointer to the EngineWrapper.
// The EngineWrapper must outlive the FlxSockets.
//
// This class is an abstract base class.  A derived class
// implements all the behavior.
//

struct EngineWrapper;

class FlxSockets
{
protected:
	FlxSockets() {}

public:
	// Create the Luprex socket system.
	static FlxSockets* Create(FlxLockedWrapper &w);

	// Close all sockets.
	virtual void ForceCloseEverything(FlxLockedWrapper& w) = 0;

	// The update routine relays data into and out of
	// luprex via TCP/IP sockets.
	virtual void Update(FlxLockedWrapper& w) = 0;

	// Delete the luprex socket system.
	// You must call ForceCloseEverything first.
	virtual ~FlxSockets() {}

	// Obtain any error status report.
	virtual std::string GetError() = 0;
};