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

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

#include "replaybrowserbasepanel.h"
#include "replaybrowseritemmanager.h"
#include "replay/genericclassbased_replay.h"
#include "game_controls/slideshowpanel.h"

using namespace vgui;

//-----------------------------------------------------------------------------
// Purpose: Slideshow panel that adds all screenshots associated 
// with a given replay.
//-----------------------------------------------------------------------------
class CReplayScreenshotSlideshowPanel : public CSlideshowPanel
{
	DECLARE_CLASS_SIMPLE( CReplayScreenshotSlideshowPanel, CSlideshowPanel );
public:
	CReplayScreenshotSlideshowPanel( Panel *pParent, const char *pName, ReplayHandle_t hReplay );

	virtual void PerformLayout();

private:
	ReplayHandle_t		m_hReplay;
};

//-----------------------------------------------------------------------------
// Purpose: An individual Replay thumbnail, with download button, title, etc.
//-----------------------------------------------------------------------------
class CExButton;
class CExLabel;
class IReplayItemManager;
class CMoviePlayerPanel;

class CReplayBrowserThumbnail : public CReplayBasePanel
{
	DECLARE_CLASS_SIMPLE( CReplayBrowserThumbnail, CReplayBasePanel );
public:
	CReplayBrowserThumbnail( Panel *pParent, const char *pName, QueryableReplayItemHandle_t hReplayItem, IReplayItemManager *pReplayItemManager );
	~CReplayBrowserThumbnail();

	virtual void ApplySchemeSettings( IScheme *pScheme );
	virtual void PerformLayout();
	virtual void OnMousePressed( MouseCode code );

	virtual void OnTick();

	virtual void OnCommand( const char *pCommand );

	void UpdateTitleText();

	void SetReplayItem( QueryableReplayItemHandle_t hReplayItem );
	
	CGenericClassBasedReplay	*GetReplay();
	IQueryableReplayItem		*GetReplayItem();

	MESSAGE_FUNC_PARAMS( OnDownloadClicked, "Download", pParams );
	MESSAGE_FUNC_PARAMS( OnDeleteReplay, "delete_replayitem", pParams );

	CCrossfadableImagePanel			*m_pScreenshotThumb;
	QueryableReplayItemHandle_t		m_hReplayItem;

private:
	void SetupReplayItemUserData( void *pUserData );
	void UpdateProgress( bool bDownloadPhase, const CReplay *pReplay );

	Label				*m_pTitle;
	Label				*m_pDownloadLabel;
	Label				*m_pRecordingInProgressLabel;
	ProgressBar			*m_pDownloadProgress;
	CExButton			*m_pDownloadButton;
	CExButton			*m_pDeleteButton;
	Label				*m_pErrorLabel;
	CMoviePlayerPanel	*m_pMoviePlayer;
	Panel				*m_pDownloadOverlay;
	EditablePanel		*m_pBorderPanel;
	Color				m_clrHighlight;
	Color				m_clrDefaultBg;
	bool				m_bMouseOver;
	IReplayItemManager	*m_pReplayItemManager;
	float				m_flLastMovieScrubTime;
	float				m_flHoverStartTime;
	float				m_flLastProgressChangeTime;
};

//-----------------------------------------------------------------------------
// Purpose: A row of Replay thumbnails (CReplayBrowserThumbnail's)
//-----------------------------------------------------------------------------
class CReplayBrowserThumbnailRow : public EditablePanel
{
	DECLARE_CLASS_SIMPLE( CReplayBrowserThumbnailRow, EditablePanel );
public:
	CReplayBrowserThumbnailRow( Panel *pParent, const char *pName, IReplayItemManager *pReplayItemManager );

	void AddReplayThumbnail( const IQueryableReplayItem *pReplay );
	void AddReplayThumbnail( QueryableReplayItemHandle_t hReplayItem );
	void DeleteReplayItemThumbnail( const IQueryableReplayItem *pReplayItem );
	int GetNumReplayItems() const { return m_vecThumbnails.Count(); }
	int GetNumVisibleReplayItems() const;

	virtual void ApplySchemeSettings( IScheme *pScheme );
	virtual void PerformLayout();

	CReplayBrowserThumbnail *FindThumbnail( const IQueryableReplayItem *pReplay );

	CUtlVector< CReplayBrowserThumbnail * > m_vecThumbnails;
	IReplayItemManager		*m_pReplayItemManager;
};

//-----------------------------------------------------------------------------
// Purpose: A collection of CReplayBrowserThumbnailRows containing replays
// recorded on a given day.
//-----------------------------------------------------------------------------
class CExLabel;
class CExButton;
class CReplayListPanel;

class CBaseThumbnailCollection : public EditablePanel
{
	DECLARE_CLASS_SIMPLE( CBaseThumbnailCollection, EditablePanel );
public:
	CBaseThumbnailCollection( CReplayListPanel *pParent, const char *pName, IReplayItemManager *pReplayItemManager );

	void			AddReplay( const IQueryableReplayItem *pItem );

	virtual bool	IsMovieCollection() const = 0;

	void			CleanupUIForReplayItem( ReplayItemHandle_t hReplayItem );

	virtual void	PerformLayout();
	virtual void	ApplySchemeSettings( IScheme *pScheme );

	void			RemoveEmptyRows();
	void			RemoveAll();

	void			OnUpdated();

	void			OnCommand( const char *pCommand );

	CReplayBrowserThumbnailRow *FindReplayItemThumbnailRow( const IQueryableReplayItem *pReplayItem );

	inline int		GetNumRows() const { return m_vecRows.Count(); }

	typedef CUtlVector< CReplayBrowserThumbnailRow * > RowContainer_t;
	RowContainer_t	m_vecRows;

protected:
	// Called from PerformLayout() - layout any panels that should appear at the top (vertically)-most position
	virtual void	LayoutUpperPanels( int nStartY, int nBgWidth ) = 0;
	virtual void	LayoutBackgroundPanel( int nWide, int nTall ) {}
	virtual Panel	*GetLowestPanel( int &nVerticalBuffer ) = 0;

	void			UpdateViewingPage( void );

	int				m_nStartX;

protected:
	CExLabel			*m_pNoReplayItemsLabel;
	IReplayItemManager	*m_pReplayItemManager;

	CExButton			*m_pShowNextButton;
	CExButton			*m_pShowPrevButton;
	CUtlVector<ReplayItemHandle_t>	m_vecReplays;
	int					m_iViewingPage;

	int					m_nReplayThumbnailsPerRow;
	int					m_nMaxRows;

	CExLabel			*m_pCaratLabel;
	CExLabel			*m_pTitleLabel;
	CExButton			*m_pRenderAllButton;

private:
	int GetRowStartY();

	CReplayListPanel	*m_pParentListPanel;		// Parent gets altered so we keep this cached ptr around
};

//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
class CReplayThumbnailCollection : public CBaseThumbnailCollection
{
	DECLARE_CLASS_SIMPLE( CReplayThumbnailCollection, CBaseThumbnailCollection );
public:
	CReplayThumbnailCollection( CReplayListPanel *pParent, const char *pName, IReplayItemManager *pReplayItemManager );

	virtual bool	IsMovieCollection() const;

	virtual void	PerformLayout();
	virtual void	ApplySchemeSettings( IScheme *pScheme );

	virtual void	LayoutUpperPanels( int nStartY, int nBgWidth );
	virtual void	LayoutBackgroundPanel( int nWide, int nTall );
	virtual Panel	*GetLowestPanel( int &nVerticalBuffer );

	Panel			*m_pLinePanel;
	CExLabel		*m_pWarningLabel;
	Panel			*m_pUnconvertedBg;
};

#define OLDER_MOVIES_COLLECTION		-2

//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
class CMovieThumbnailCollection : public CBaseThumbnailCollection
{
	DECLARE_CLASS_SIMPLE( CMovieThumbnailCollection, CBaseThumbnailCollection );
public:
	CMovieThumbnailCollection( CReplayListPanel *pParent, const char *pName, IReplayItemManager *pReplayItemManager,
								     int nDay, int nMonth, int nYear, bool bShowSavedMoviesLabel );
	CMovieThumbnailCollection( CReplayListPanel *pParent, const char *pName, IReplayItemManager *pReplayItemManager,
								     bool bShowSavedMoviesLabel );

	bool			DoesDateMatch( int nDay, int nMonth, int nYear );
	virtual bool	IsMovieCollection() const;

private:
	void			Init( int nDay, int nMonth, int nYear, bool bShowSavedMoviesLabel );
	virtual void	PerformLayout();
	virtual void	ApplySchemeSettings( IScheme *pScheme );

	Panel			*GetLowestPanel( int &nVerticalBuffer );
	void			LayoutUpperPanels( int nStartY, int nBgWidth );

	int				m_nDay, m_nMonth, m_nYear;
	CExLabel		*m_pDateLabel;
	bool			m_bShowSavedMoviesLabel;
};

#endif // REPLAYLISTITEMPANEL_H