#pragma once

#include <CS2/SDK/Interface/Interface.hpp>

enum InitReturnVal_t
{
	INIT_FAILED = 0 ,
	INIT_OK ,
	INIT_LAST_VAL ,
};

enum AppSystemTier_t
{
	APP_SYSTEM_TIER0 = 0 ,
	APP_SYSTEM_TIER1 ,
	APP_SYSTEM_TIER2 ,
	APP_SYSTEM_TIER3 ,

	APP_SYSTEM_TIER_OTHER ,
};

struct AppSystemInfo_t
{
	const char* m_pModuleName;
	const char* m_pInterfaceName;
};

class IAppSystem
{
public:
	// Here's where the app systems get to learn about each other 
	virtual bool Connect( CreateInterfaceFn factory ) = 0;
	virtual void Disconnect() = 0;

	// Here's where systems can access other interfaces implemented by this object
	// Returns NULL if it doesn't implement the requested interface
	virtual void* QueryInterface( const char* pInterfaceName ) = 0;

	// Init, shutdown
	virtual InitReturnVal_t Init() = 0;
	virtual void Shutdown() = 0;
	virtual void PreShutdown() = 0;

	// Returns all dependent libraries
	virtual const AppSystemInfo_t* GetDependencies() = 0;

	// Returns the tier
	virtual AppSystemTier_t GetTier() = 0;

	// Reconnect to a particular interface
	virtual void Reconnect( CreateInterfaceFn factory , const char* pInterfaceName ) = 0;

	// Returns whether or not the app system is a singleton
	virtual bool IsSingleton() = 0;
	virtual int GetBuildType() = 0;
};
