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

#ifndef BUYPRESET_WEAPONSETLABEL_H
#define BUYPRESET_WEAPONSETLABEL_H
#ifdef _WIN32
#pragma once
#endif

#include <vgui/VGUI.h>
#include <vgui_controls/Panel.h>
#include <vgui/IImage.h>

namespace vgui
{
	class TextImage;
	class TextEntry;
};

//--------------------------------------------------------------------------------------------------------------
/// Helper function: draws a simple dashed line
void DrawDashedLine(int x0, int y0, int x1, int y1, int dashLen, int gapLen);

//--------------------------------------------------------------------------------------------------------------
// Purpose: Wraps an IImage to perform resizes properly
class BuyPresetImage : public vgui::IImage
{
public:
	BuyPresetImage( vgui::IImage *realImage )
	{
		m_image = realImage;
		if ( m_image )
		{
			m_image->GetSize( m_wide, m_tall );
		}
		else
		{
			m_wide = m_tall = 0;
		}
	}

	// Call to Paint the image
	// Image will draw within the current panel context at the specified position
	virtual void Paint()
	{
		if ( !m_image )
			return;

		m_image->Paint();
	}

	// Set the position of the image
	virtual void SetPos(int x, int y)
	{
		if ( !m_image )
			return;

		m_image->SetPos( x, y );
	}

	// Gets the size of the content
	virtual void GetContentSize(int &wide, int &tall)
	{
		if ( !m_image )
			return;

		m_image->GetSize( wide, tall );
	}

	// Get the size the image will actually draw in (usually defaults to the content size)
	virtual void GetSize(int &wide, int &tall)
	{
		if ( !m_image )
		{
			wide = tall = 0;
			return;
		}

		wide = m_wide;
		tall = m_tall;
	}

	// Sets the size of the image
	virtual void SetSize(int wide, int tall)
	{
		m_wide = wide;
		m_tall = tall;
		if ( !m_image )
			return;

		m_image->SetSize( wide, tall );
	}

	// Set the draw color 
	virtual void SetColor(Color col)
	{
		if ( !m_image )
			return;

		m_image->SetColor( col );
	}

	virtual bool Evict()
	{
		return false;
	}

	virtual int GetNumFrames()
	{
		return 0;
	}

	virtual void SetFrame( int nFrame )
	{
	}

	virtual vgui::HTexture GetID()
	{
		return 0;
	}

	virtual void SetRotation( int iRotation )
	{
		return;
	}

private:
	vgui::IImage *m_image;
	int m_wide, m_tall;
};

//--------------------------------------------------------------------------------------------------------------
struct ImageInfo {
	vgui::IImage *image;
	int w;
	int h;
	int x;
	int y;
	int fullW;
	int fullH;

	void FitInBounds( int baseX, int baseY, int width, int height, bool center, int scaleAt1024, bool halfHeight = false );
	void Paint();
};

//--------------------------------------------------------------------------------------------------------------
class WeaponImageInfo
{
public:
	WeaponImageInfo();
	~WeaponImageInfo();

	void SetBounds( int left, int top, int wide, int tall );
	void SetCentered( bool isCentered );
	void SetScaleAt1024( int weaponScale, int ammoScale );
	void SetWeapon( const BuyPresetWeapon *pWeapon, bool isPrimary, bool useCurrentAmmoType );

	void ApplyTextSettings( vgui::IScheme *pScheme, bool isProportional );

	void Paint();
	void PaintText();

private:
	void PerformLayout();

	int m_left;
	int m_top;
	int m_wide;
	int m_tall;

	bool m_isPrimary;

	int m_weaponScale;
	int m_ammoScale;

	bool m_needLayout;
	bool m_isCentered;
	ImageInfo m_weapon;
	ImageInfo m_ammo;

	vgui::TextImage *m_pAmmoText;
};

//--------------------------------------------------------------------------------------------------------------
class ItemImageInfo
{
public:
	ItemImageInfo();
	~ItemImageInfo();

	void SetBounds( int left, int top, int wide, int tall );
	void SetItem( const char *imageFname, int count );
	void ApplyTextSettings( vgui::IScheme *pScheme, bool isProportional );

	void Paint();
	void PaintText();

private:
	void PerformLayout();

	int m_left;
	int m_top;
	int m_wide;
	int m_tall;

	int m_count;

	bool m_needLayout;
	ImageInfo m_image;

	vgui::TextImage *m_pText;
};

//--------------------------------------------------------------------------------------------------------------
class WeaponLabel : public vgui::Panel
{
	typedef vgui::Panel BaseClass;
public:
	WeaponLabel(vgui::Panel *parent, const char *panelName);
	~WeaponLabel();

	void SetWeapon( const BuyPresetWeapon *pWeapon, bool isPrimary, bool showAmmo = false );

	virtual void ApplySchemeSettings(vgui::IScheme *pScheme);
	virtual void PerformLayout();
	virtual void Paint();

protected:
	WeaponImageInfo m_weapon;
};

//--------------------------------------------------------------------------------------------------------------
class EquipmentLabel : public vgui::Panel
{
	typedef vgui::Panel BaseClass;
public:
	EquipmentLabel(vgui::Panel *parent, const char *panelName, const char *imageFname = NULL);
	~EquipmentLabel();

	void SetItem( const char *imageFname, int count );

	virtual void ApplySchemeSettings(vgui::IScheme *pScheme);
	virtual void PerformLayout();
	virtual void Paint();

protected:
	ItemImageInfo m_item;
};

//--------------------------------------------------------------------------------------------------------------
/**
 * BuyPresetEditPanel is a panel displaying a graphical representation of a buy preset.
 */
class BuyPresetEditPanel : public vgui::EditablePanel
{
	typedef vgui::EditablePanel BaseClass;
public:
	BuyPresetEditPanel( vgui::Panel *parent, const char *panelName, const char *resourceFilename, int fallbackIndex, bool editableName );
	virtual ~BuyPresetEditPanel();

	void SetWeaponSet( const WeaponSet *pWeaponSet, bool current );
	virtual void SetText( const wchar_t *text );

	virtual void ApplySchemeSettings(vgui::IScheme *pScheme);
	void OnCommand( const char *command);					///< Handle command callbacks

	virtual void OnSizeChanged( int wide, int tall );

	void SetPanelBgColor( Color color ) { if (m_pBgPanel) m_pBgPanel->SetBgColor( color ); }

protected:
	void Reset();

	vgui::Panel *m_pBgPanel;

	vgui::TextEntry *m_pTitleEntry;
	vgui::Label *m_pTitleLabel;
	vgui::Label *m_pCostLabel;

	WeaponLabel *m_pPrimaryWeapon;
	WeaponLabel *m_pSecondaryWeapon;

	EquipmentLabel *m_pHEGrenade;
	EquipmentLabel *m_pSmokeGrenade;
	EquipmentLabel *m_pFlashbangs;

	EquipmentLabel *m_pDefuser;
	EquipmentLabel *m_pNightvision;

	EquipmentLabel *m_pArmor;

	int m_baseWide;
	int m_baseTall;

	int m_fallbackIndex;
};


#endif // BUYPRESET_WEAPONSETLABEL_H