//========= Copyright � 1996-2009, Valve LLC, All rights reserved. ============
//
// Purpose: Class for Remote Play session list
//
//=============================================================================

#include "stdafx.h"
#include "RemotePlay.h"
#include "BaseMenu.h"


//-----------------------------------------------------------------------------
// Purpose: Menu that shows your Remote Play session
//-----------------------------------------------------------------------------
class CRemotePlayListMenu : public CBaseMenu<RemotePlayListMenuItem_t>
{
	static const RemotePlayListMenuItem_t k_menuItemEmpty;

public:

	//-----------------------------------------------------------------------------
	// Purpose: Constructor
	//-----------------------------------------------------------------------------
	CRemotePlayListMenu( IGameEngine *pGameEngine ) : CBaseMenu<RemotePlayListMenuItem_t>( pGameEngine )
	{
		
	}

	//-----------------------------------------------------------------------------
	// Purpose: Creates Remote Play session list menu
	//-----------------------------------------------------------------------------
	void Rebuild()
	{
		PushSelectedItem();
		ClearMenuItems();

		AddMenuItem( CRemotePlayListMenu::MenuItem_t( "Remote Play Session List", k_menuItemEmpty ) );

		InputHandle_t arrInputHandles[ STEAM_INPUT_MAX_COUNT ];
		int nNumControllers = SteamInput()->GetConnectedControllers( arrInputHandles );

		uint32 unSessionCount = SteamRemotePlay()->GetSessionCount();
		for ( uint32 iIndex = 0; iIndex < unSessionCount; iIndex++ )
		{
			uint32 unSessionID = SteamRemotePlay()->GetSessionID( iIndex );
			if ( !unSessionID )
			{
				continue;
			}

			RemotePlayListMenuItem_t item;
			item.m_unSessionID = unSessionID;

			const char *pszSessionPersonaName = SteamFriends()->GetFriendPersonaName( SteamRemotePlay()->GetSessionSteamID( unSessionID ) );
			const char *pszSessionClientName = SteamRemotePlay()->GetSessionClientName( unSessionID );
			const char *pszSessionClientFormFactor = GetFormFactor( SteamRemotePlay()->GetSessionClientFormFactor( unSessionID ) );

			int nResolutionX, nResolutionY;
			SteamRemotePlay()->BGetSessionClientResolution( unSessionID, &nResolutionX, &nResolutionY );

			char szLabel[ 1024 ];
			snprintf( szLabel, sizeof( szLabel ), "%s streaming to %s: %s %dx%d", pszSessionPersonaName, pszSessionClientName, pszSessionClientFormFactor, nResolutionX, nResolutionY );

			for ( int iController = 0; iController < nNumControllers; ++iController )
			{
				if ( SteamInput()->GetRemotePlaySessionID( arrInputHandles[ iController ] ) == unSessionID )
				{
					strncat( szLabel, ", has ", sizeof( szLabel ) - strlen( szLabel ) - 1 );
					strncat( szLabel, GetControllerType( SteamInput()->GetInputTypeForHandle( arrInputHandles[ iController ] ) ), sizeof( szLabel ) - strlen( szLabel ) - 1 );
				}
			}
			AddMenuItem( CRemotePlayListMenu::MenuItem_t( szLabel, item ) );
		}

		PopSelectedItem();
	}

private:
	const char *GetFormFactor( ESteamDeviceFormFactor eFormFactor )
	{
		switch ( eFormFactor )
		{
		case k_ESteamDeviceFormFactorPhone:
			return "[PHONE]";
		case k_ESteamDeviceFormFactorTablet:
			return "[TABLET]";
		case k_ESteamDeviceFormFactorComputer:
			return "[COMPUTER]";
		case k_ESteamDeviceFormFactorTV:
			return "[TV]";
		default:
			return "[UNKNOWN]";
		}
	}

	const char *GetControllerType( ESteamInputType eInputType )
	{
		switch ( eInputType )
		{
		case k_ESteamInputType_SteamController:
			return "Steam Controller";
		case k_ESteamInputType_XBox360Controller:
			return "XBox 360 Controller";
		case k_ESteamInputType_XBoxOneController:
			return "XBox One Controller";
		case k_ESteamInputType_PS4Controller:
			return "PS4 Controller";
		case k_ESteamInputType_MobileTouch:
			return "Touch Controller";
		default:
			return "Game Controller";
		}
	}
};

const RemotePlayListMenuItem_t CRemotePlayListMenu::k_menuItemEmpty = { 0 };


//-----------------------------------------------------------------------------
// Purpose: Constructor
//-----------------------------------------------------------------------------
CRemotePlayList::CRemotePlayList( IGameEngine *pGameEngine ) : m_pGameEngine( pGameEngine )
{
	m_pRemotePlayListMenu = new CRemotePlayListMenu( pGameEngine );
	m_nNumControllers = 0;
}


//-----------------------------------------------------------------------------
// Purpose: Run a frame for the CRemotePlayList
//-----------------------------------------------------------------------------
void CRemotePlayList::RunFrame()
{
	InputHandle_t arrInputHandles[ STEAM_INPUT_MAX_COUNT ];
	int nNumControllers = SteamInput()->GetConnectedControllers( arrInputHandles );
	if ( nNumControllers != m_nNumControllers )
	{
		m_nNumControllers = nNumControllers;

		m_pRemotePlayListMenu->Rebuild();
	}

	m_pRemotePlayListMenu->RunFrame();	
}


//-----------------------------------------------------------------------------
// Purpose: Handles menu actions when viewing a Remote Play session list
//-----------------------------------------------------------------------------
void CRemotePlayList::OnMenuSelection( RemotePlayListMenuItem_t selection )
{
	// Do nothing (yet)
}


//-----------------------------------------------------------------------------
// Purpose: Shows / Refreshes the Remote Play session list
//-----------------------------------------------------------------------------
void CRemotePlayList::Show()
{
	m_pRemotePlayListMenu->Rebuild();
}


//-----------------------------------------------------------------------------
// Purpose: Handle Remote Play session connected
//-----------------------------------------------------------------------------
void CRemotePlayList::OnRemotePlaySessionConnected( SteamRemotePlaySessionConnected_t *pParam )
{
	m_pRemotePlayListMenu->Rebuild();
}


//-----------------------------------------------------------------------------
// Purpose: Handle Remote Play session disconnected
//-----------------------------------------------------------------------------
void CRemotePlayList::OnRemotePlaySessionDisconnected( SteamRemotePlaySessionDisconnected_t *pParam )
{
	m_pRemotePlayListMenu->Rebuild();
}
