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

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

#include "vgui_controls/EditablePanel.h"

using namespace vgui;

#define MAX_STREAM_PANELS 5

class CStreamInfo
{
public:
	CStreamInfo() : m_numViewers( 0 ) {}
public:
	CUtlString m_sGlobalName;
	int m_numViewers;
	CUtlString m_sDisplayName;
	CUtlString m_sTextDescription;
	CUtlString m_sUpdatedAtStamp;
	CUtlString m_sPreviewImage;
	CUtlString m_sPreviewImageLocalFile;
	CUtlString m_sPreviewImageSF;
	CUtlString m_sLanguage;
	CUtlString m_sCountry;
	CUtlString m_sVideoFeedUrl;
};

class CTFStreamPanel : public EditablePanel
{
public:
	DECLARE_CLASS_SIMPLE( CTFStreamPanel, EditablePanel );

	CTFStreamPanel( Panel *parent, const char *panelName );
	virtual ~CTFStreamPanel() {}

	virtual void ApplySchemeSettings( IScheme *pScheme ) OVERRIDE;
	virtual void PerformLayout() OVERRIDE;
	virtual void OnCommand( const char *command ) OVERRIDE;

	void SetGlobalName( const char *pszGlobalName ) { m_strStreamInfoGlobalName = pszGlobalName; }
	CStreamInfo *GetStreamInfo() const;

private:
	void UpdatePanels();
	void SetPreviewImage( const char *pszPreviewImageFile );

	CUtlString m_strStreamInfoGlobalName;

	class vgui::ImagePanel *m_pPreviewImage;
};

class CTFStreamListPanel : public EditablePanel, public CGameEventListener
{
public:
	DECLARE_CLASS_SIMPLE( CTFStreamListPanel, EditablePanel );

	CTFStreamListPanel( Panel *parent, const char *panelName );
	virtual ~CTFStreamListPanel() {}

	virtual void ApplySchemeSettings( IScheme *pScheme ) OVERRIDE;
	virtual void OnThink() OVERRIDE;
	virtual void OnCommand( const char *command ) OVERRIDE;

	virtual void FireGameEvent( IGameEvent *event ) OVERRIDE;

	CTFStreamPanel *m_arrStreamPanels[MAX_STREAM_PANELS];
};

enum ETwitchTvState_t
{
	k_ETwitchTvState_None,
	k_ETwitchTvState_Loading,
	k_ETwitchTvState_NoLink,
	k_ETwitchTvState_Linked,
	k_ETwitchTvState_Error
};

struct TwitchTvAccountInfo_t
{
	uint64 m_uiSteamID;

	ETwitchTvState_t m_eTwitchTvState;
	double m_dblTimeStampTwitchTvUpdate;
	uint64 m_uiTwitchTvUserId;
	CUtlString m_sTwitchTvChannel;
};

class CTFStreamManager : public CAutoGameSystemPerFrame
{
public:
	CTFStreamManager();
	~CTFStreamManager();

	virtual bool Init() OVERRIDE;
	virtual void Update( float frametime ) OVERRIDE;
	void RequestTopStreams();

	CStreamInfo * GetStreamInfoByName( char const *szName );

	CUtlVector< CStreamInfo >& GetStreamInfoVec() { return m_streamInfoVec; }

	TwitchTvAccountInfo_t* GetTwitchTvAccountInfo( uint64 uiSteamID );

private: // cache stream info
	CUtlVector< CStreamInfo > m_streamInfoVec;

private: // query for top X viewers
	double m_dblTimeStampLastUpdate;
	HTTPRequestHandle m_hHTTPRequestHandle;
	CCallResult< CTFStreamManager, HTTPRequestCompleted_t > m_CallbackOnHTTPRequestCompleted;
	void Steam_OnHTTPRequestCompletedStreams( HTTPRequestCompleted_t *p, bool bError );

private: // checking for twitch account linking with steam account
	void UpdateTwitchTvAccounts();

	TwitchTvAccountInfo_t *m_pLoadingAccount;
	CUtlVector< TwitchTvAccountInfo_t* > m_vecTwitchTvAccounts; // list of steam id to updated twitch account
	HTTPRequestHandle m_hHTTPRequestHandleTwitchTv;
	CCallResult< CTFStreamManager, HTTPRequestCompleted_t > m_CallbackOnHTTPRequestCompletedTwitchTv;
	void Steam_OnHTTPRequestCompletedMyTwitchTv( HTTPRequestCompleted_t *p, bool bError );
};
CTFStreamManager *StreamManager();

#endif // TF_STREAMS_H