//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
// $NoKeywords: $
//=============================================================================

#include "pch_serverbrowser.h"

bool IsReplayServer( newgameserver_t &server );

//-----------------------------------------------------------------------------
// Purpose: List password column sort function
//-----------------------------------------------------------------------------
int __cdecl PasswordCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
{
	newgameserver_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
	newgameserver_t *s2 = ServerBrowserDialog().GetServer(p2.userData);

	if ( !s1 && s2 ) 
		return -1;
	if ( !s2 && s1 )
		return 1;
	if ( !s1 && !s2 )
		return 0;

	if ( s1->m_bPassword < s2->m_bPassword )
		return 1;
	else if ( s1->m_bPassword > s2->m_bPassword )
		return -1;

	return 0;
}

//-----------------------------------------------------------------------------
// Purpose: list column sort function
//-----------------------------------------------------------------------------
int __cdecl BotsCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
{
	newgameserver_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
	newgameserver_t *s2 = ServerBrowserDialog().GetServer(p2.userData);

	if ( !s1 && s2 ) 
		return -1;
	if ( !s2 && s1 )
		return 1;
	if ( !s1 && !s2 )
		return 0;

	if ( s1->m_nBotPlayers < s2->m_nBotPlayers )
		return 1;
	else if ( s1->m_nBotPlayers > s2->m_nBotPlayers )
		return -1;

	return 0;
}

//-----------------------------------------------------------------------------
// Purpose: list column sort function
//-----------------------------------------------------------------------------
int __cdecl SecureCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
{
	return 0;
}

//-----------------------------------------------------------------------------
// Purpose: list column sort function
//-----------------------------------------------------------------------------
int __cdecl IPAddressCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
{
	newgameserver_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
	newgameserver_t *s2 = ServerBrowserDialog().GetServer(p2.userData);

	if ( !s1 && s2 ) 
		return -1;
	if ( !s2 && s1 )
		return 1;
	if ( !s1 && !s2 )
		return 0;

	if ( s1->m_NetAdr < s2->m_NetAdr )
		return -1;
	else if ( s2->m_NetAdr < s1->m_NetAdr )
		return 1;

	return 0;
}

//-----------------------------------------------------------------------------
// Purpose: Ping comparison function
//-----------------------------------------------------------------------------
int __cdecl PingCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
{
	newgameserver_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
	newgameserver_t *s2 = ServerBrowserDialog().GetServer(p2.userData);

	if ( !s1 && s2 ) 
		return -1;
	if ( !s2 && s1 )
		return 1;
	if ( !s1 && !s2 )
		return 0;

	int ping1 = s1->m_nPing;
	int ping2 = s2->m_nPing;

	if ( ping1 < ping2 )
		return -1;
	else if ( ping1 > ping2 )
		return 1;
	
	return 0;
}

//-----------------------------------------------------------------------------
// Purpose: Map comparison function
//-----------------------------------------------------------------------------
int __cdecl MapCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
{
	newgameserver_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
	newgameserver_t *s2 = ServerBrowserDialog().GetServer(p2.userData);

	if ( !s1 && s2 ) 
		return -1;
	if ( !s2 && s1 )
		return 1;
	if ( !s1 && !s2 )
		return 0;

	return Q_stricmp( s1->m_szMap, s2->m_szMap );
}

//-----------------------------------------------------------------------------
// Purpose: Game dir comparison function
//-----------------------------------------------------------------------------
int __cdecl GameCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
{
	newgameserver_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
	newgameserver_t *s2 = ServerBrowserDialog().GetServer(p2.userData);

	if ( !s1 && s2 ) 
		return -1;
	if ( !s2 && s1 )
		return 1;
	if ( !s1 && !s2 )
		return 0;

	// make sure we haven't added the same server to the list twice
	Assert( p1.userData != p2.userData );

	return Q_stricmp( s1->m_szGameDescription, s2->m_szGameDescription );
}

//-----------------------------------------------------------------------------
// Purpose: Server name comparison function
//-----------------------------------------------------------------------------
int __cdecl ServerNameCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
{
	newgameserver_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
	newgameserver_t *s2 = ServerBrowserDialog().GetServer(p2.userData);

	if ( !s1 && s2 ) 
		return -1;
	if ( !s2 && s1 )
		return 1;
	if ( !s1 && !s2 )
		return 0;

	return Q_stricmp( s1->m_szServerName, s2->m_szServerName );
}

//-----------------------------------------------------------------------------
// Purpose: Player number comparison function
//-----------------------------------------------------------------------------
int __cdecl PlayersCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
{
	newgameserver_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
	newgameserver_t *s2 = ServerBrowserDialog().GetServer(p2.userData);

	if ( !s1 && s2 ) 
		return -1;
	if ( !s2 && s1 )
		return 1;
	if ( !s1 && !s2 )
		return 0;

	int s1p = max( 0, s1->m_nPlayers - s1->m_nBotPlayers );
	int s1m = max( 0, s1->m_nMaxPlayers - s1->m_nBotPlayers );
	int s2p = max( 0, s2->m_nPlayers - s2->m_nBotPlayers );
	int s2m = max( 0, s2->m_nMaxPlayers - s2->m_nBotPlayers );

	// compare number of players
	if ( s1p > s2p )
		return -1;
	if ( s1p < s2p )
		return 1;

	// compare max players if number of current players is equal
	if ( s1m > s2m )
		return -1;
	if ( s1m < s2m )
		return 1;

	return 0;
}

//-----------------------------------------------------------------------------
// Purpose: Player number comparison function
//-----------------------------------------------------------------------------
int __cdecl LastPlayedCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
{
	return 0;
}

//-----------------------------------------------------------------------------
// Purpose: Tag comparison function
//-----------------------------------------------------------------------------
int __cdecl TagsCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
{
	newgameserver_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
	newgameserver_t *s2 = ServerBrowserDialog().GetServer(p2.userData);

	if ( !s1 && s2 ) 
		return -1;
	if ( !s2 && s1 )
		return 1;
	if ( !s1 && !s2 )
		return 0;

	return Q_stricmp( s1->m_szGameTags, s2->m_szGameTags );
}

//-----------------------------------------------------------------------------
// Purpose: Replay comparison function
//-----------------------------------------------------------------------------
int __cdecl ReplayCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
{
	newgameserver_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
	newgameserver_t *s2 = ServerBrowserDialog().GetServer(p2.userData);

	if ( !s1 && s2 ) 
		return -1;
	if ( !s2 && s1 )
		return 1;
	if ( !s1 && !s2 )
		return 0;

	bool s1_is_replay = IsReplayServer( *s1 );
	bool s2_is_replay = IsReplayServer( *s2 );

	if ( s1_is_replay < s2_is_replay )
		return 1;
	else if ( s1_is_replay > s2_is_replay )
		return -1;

	return 0;
}