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

#include "BudgetPanelContainer.h"
#include "mathlib/mathlib.h"
#include "vgui/vgui_budgetpanelshared.h"
#include "AdminServer.h"
#include "ivprofexport.h"
#include "vgui/ilocalize.h"
#include "vgui/ISurface.h"
#include "vgui/vgui_BaseBudgetPanel.h"


// -------------------------------------------------------------------------------------------------------------------- //
// CBudgetPanelAdmin declaration.
// -------------------------------------------------------------------------------------------------------------------- //

class CBudgetPanelAdmin : public CBudgetPanelShared
{
	typedef CBudgetPanelShared BaseClass;

public:

	CBudgetPanelAdmin( vgui::Panel *pParent, const char *pElementName );

	virtual void SetupCustomConfigData( CBudgetPanelConfigData &data );
	virtual void PostChildPaint();
	virtual void OnTick();
	virtual void ApplySchemeSettings( vgui::IScheme *pScheme );

	void DrawColoredText( 
		vgui::HFont font, 
		int x, int y, 
		int r, int g, int b, int a,
		const char *pText,
		... );

private:
	Color m_budgetTextColor;
};



CBudgetPanelAdmin::CBudgetPanelAdmin( vgui::Panel *pParent, const char *pElementName ) : 
	BaseClass( pParent, pElementName, BUDGETFLAG_SERVER )
{
	MarkAsDedicatedServer();
}


void CBudgetPanelAdmin::SetupCustomConfigData( CBudgetPanelConfigData &data )
{
	GetBounds( data.m_xCoord, data.m_yCoord, data.m_Width, data.m_Height );
}


void CBudgetPanelAdmin::DrawColoredText( 
	vgui::HFont font, 
	int x, int y, 
	int r, int g, int b, int a,
	const char *pText,
	... )
{
	char msg[4096];
	va_list marker;
	va_start( marker, pText );
	_vsnprintf( msg, sizeof( msg ), pText, marker );
	va_end( marker );

	wchar_t unicodeStr[4096];
	int nChars = g_pVGuiLocalize->ConvertANSIToUnicode( msg, unicodeStr, sizeof( unicodeStr ) );

	vgui::surface()->DrawSetTextFont( font );
	vgui::surface()->DrawSetTextColor( r, g, b, a );
	vgui::surface()->DrawSetTextPos( x, y );
	vgui::surface()->DrawPrintText( unicodeStr, nChars-1 );
}


void CBudgetPanelAdmin::ApplySchemeSettings( vgui::IScheme *pScheme )
{
	BaseClass::ApplySchemeSettings( pScheme );
	m_budgetTextColor = pScheme->GetColor( "BrightControlText", Color( 0, 255, 0, 255 ) );
}


void CBudgetPanelAdmin::PostChildPaint()
{
	DrawColoredText( m_hFont, 0, 0, m_budgetTextColor[0], m_budgetTextColor[1], m_budgetTextColor[2], m_budgetTextColor[3], "%i fps (showbudget 3D driver time included)", RoundFloatToInt(g_fFrameRate) );
	DrawColoredText( m_hFont, 0, 16, m_budgetTextColor[0], m_budgetTextColor[1], m_budgetTextColor[2], m_budgetTextColor[3], "%.1f ms", g_fFrameTimeLessBudget*1000.0f );

	BaseClass::PostChildPaint();
}


void CBudgetPanelAdmin::OnTick()
{
	// Don't do all the work if we're not being drawn.
	if ( IsVisible() )
	{
		SnapshotVProfHistory( 0 );
		MarkForFullRepaint();
	}
	
	BaseClass::OnTick();
}



// ------------------------------------------------------------------------------------------------------------------------------------------------ //
// The budget panel container class. Just holds CBudgetPanelAdmin.
// ------------------------------------------------------------------------------------------------------------------------------------------------ //

CBudgetPanelContainer::CBudgetPanelContainer(vgui::Panel *parent, const char *name) : PropertyPage(parent, name)
{
	LoadControlSettings("Admin/BudgetPanel.res", "PLATFORM");
	m_pBudgetPanelAdmin = new CBudgetPanelAdmin( this, "AdminBudgetPanel" );
	m_pBudgetPanelAdmin->SetVisible( false );
	InvalidateLayout();
}


CBudgetPanelContainer::~CBudgetPanelContainer()
{
}


void CBudgetPanelContainer::OnServerDataResponse( const char *value, const char *response )
{
}


void CBudgetPanelContainer::Paint()
{
	
}


void CBudgetPanelContainer::PerformLayout()
{
	BaseClass::PerformLayout();
	int x, y, wide, tall;
	GetBounds( x, y, wide, tall );
	m_pBudgetPanelAdmin->SetBounds( 12, 12, wide - 24, tall - 24 );
	m_pBudgetPanelAdmin->SendConfigDataToBase();
}


//-----------------------------------------------------------------------------
// Purpose: Activates the page
//-----------------------------------------------------------------------------
void CBudgetPanelContainer::OnPageShow()
{
	if ( g_pVProfExport )
		g_pVProfExport->AddListener();

	m_pBudgetPanelAdmin->SetVisible( true );
	BaseClass::OnPageShow();
}


//-----------------------------------------------------------------------------
// Purpose: Hides the page
//-----------------------------------------------------------------------------
void CBudgetPanelContainer::OnPageHide()
{
	if ( g_pVProfExport )
		g_pVProfExport->RemoveListener();

	m_pBudgetPanelAdmin->SetVisible( false );
	BaseClass::OnPageHide();
}