#pragma once

#include "app.h"

extern HWND ghWnd;

// per-frame observer called once per RunMissions frame, after the
// foreground pass (the single-player local-console marshal uses this)
extern void (*gPerFrameHook)();

// True when an in-process console marshals the launch: suppresses the
// no-console self-run in CheckLoadMessageHandler so a hosted network
// race stages at WaitingForLaunch until every pod is ready. Plain
// single player leaves it False and auto-runs exactly as always.
extern Logical gConsoleMarshalsLaunch;

// True for lobby-member races: losing the console mid-mission ends the
// mission (the owner left - without a console the timer counts up
// forever). Arcade -net pods leave it False and re-listen for their
// console to return, exactly as always.
extern Logical gConsoleLossEndsMission;

class ApplicationManager : public Node
{
public:
	ApplicationManager(HINSTANCE hInstance, HWND hWnd, Scalar frame_rate);
	~ApplicationManager();

	void StartApplication(Application *new_app);

	void RunMissions();

	Scalar GetFrameRate()
	{
		Check(this);
		return frameRate;
	}

	HINSTANCE	GetHInstance()	{ return mHInstance; }
	HWND		GetHWnd()		{ return ghWnd; }

	static ApplicationManager* GetCurrentManager()	{ return CurrentAppManager; }

protected:
	static ApplicationManager* CurrentAppManager;

	Scalar					frameDuration, frameRate;
	SChainOf<Application*>	runningApplications;
	HINSTANCE				mHInstance;
};
