#pragma once

#include "rpl4app.h"
#include "..\munga_l4\l4splr.h"

//##########################################################################
//#######################    RPSpoolerTask    ##############################
//##########################################################################

class RPSpoolerTask:
	public SpoolerTask
{
public:
	RPSpoolerTask();
	~RPSpoolerTask();

	void
		DispatchPacket(NetworkPacket *packet);
	long
		GetTimeBias();
};

class RPL4IdleApplication : public RPL4Application
{
public:
	RPL4IdleApplication (HINSTANCE hInstance, HWND hWnd, ResourceFile *resource);
	~RPL4IdleApplication();

	MissionReviewApplicationManager*
	GetApplicationManager()
		{
			return
				(MissionReviewApplicationManager*)
					Application::GetApplicationManager();
		}

	Logical Shutdown(int remainingApps);

protected:
		Registry* MakeRegistry();
		NetworkManager* MakeNetworkManager();
		void LoadBackgroundTasks();
		Logical ExecuteForeground(Time start_of_frame, Scalar frame_duration);
		void Initialize();
};

//##########################################################################
//####################    RPPlaybackApplication    ##########################
//##########################################################################

class RPL4PlaybackApplication:
	public RPL4Application
{
public:
	RPL4PlaybackApplication(
		HINSTANCE hInstance,
		HWND hWnd,
		ResourceFile *resource,
		SpoolFile *spool_file = NULL
	);
	~RPL4PlaybackApplication();

	Logical
  	TestInstance() const;

	void
		SetSpoolFile(SpoolFile *spool_file)
			{spoolFile = spool_file;}

	MissionReviewApplicationManager*
		GetApplicationManager()
			{
				return
					(MissionReviewApplicationManager*)
						Application::GetApplicationManager();
			}

	long
		GetTimeBias()
			{return timeBias;}

	void
		DispatchPacket(NetworkPacket *packet);

protected:
	NetworkManager*
		MakeNetworkManager();

	long
		timeBias;

	void
		Initialize();
	void
		LoadBackgroundTasks();
	Logical
		ExecuteForeground(
			Time start_of_frame,
			Scalar frame_duration
		);
	void
		ExecuteBackgroundTask();

	static const HandlerEntry
		MessageHandlerEntries[];
	//static MessageHandlerSet MessageHandlers;
	static MessageHandlerSet& GetMessageHandlers();

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Shared Data Support
//
public:
	//static Derivation *GetClassDerivations();
	static Derivation *GetClassDerivations();
	static SharedData DefaultData;

	void
		RunMissionMessageHandler(RunMissionMessage *message);
	void
		StopMissionMessageHandler(StopMissionMessage *message);
};
