//
// Class to handle and manage integration with social networks.
// 4J Studios Ltd, 2011.
// Andy West
//

#ifndef _SOCIAL_MANAGER_H
#define _SOCIAL_MANAGER_H

#include <xsocialpost.h>

#define MAX_SOCIALPOST_CAPTION	60
#define MAX_SOCIALPOST_DESC		100

// XDK only provides for facebook so far. Others may follow!?
enum ESocialNetwork
{
	eFacebook = 0,
	eNumSocialNetworks
};


// Class follows singleton design pattern.
class CSocialManager
{
private:
	// Default constructor, copy constructor and assignment operator are all private.
	CSocialManager();
	CSocialManager( const CSocialManager& );
	CSocialManager& operator= ( const CSocialManager& );

	// Static private instance.
	static CSocialManager* m_pInstance;

	// Bitset of title posting capability flags ( XSOCIAL_CAPABILITY_POSTIMAGE, XSOCIAL_CAPABILITY_POSTLINK ).
	DWORD		m_dwSocialPostingCapability;

	// Index of user who made current active request.
	DWORD		m_dwCurrRequestUser;

	// WESTY : Not sure if we even need to get social access key!
/*
	// Size of the social network access key text buffer.
	DWORD		m_dwAccessKeyTextSize;

	// Pointer to the social network access key text buffer.
	LPWSTR		m_pAccessKeyText;
	*/

	// The various states of the manager.
	enum EState
	{
		eStateUnitialised = 0,
		eStateReady,
		eStateGetPostingCapability,
		eStatePostingImage,
		eStatePostingLink,
	};

	
	// Current state that manager is in.
	EState					m_eCurrState;

	// For xsocial asyncronous operations.
	XOVERLAPPED				m_Overlapped;
	DWORD					m_dwOverlappedResultCode;

	// Social post preview image struct.
	XSOCIAL_PREVIEWIMAGE	m_PostPreviewImage;

	// Social post image params.
	XSOCIAL_IMAGEPOSTPARAMS	m_PostImageParams;

	// Social post link params.
	XSOCIAL_LINKPOSTPARAMS	m_PostLinkParams;

	// Image details for posting an image to social network.
	unsigned char*			m_pMainImageBuffer;
	DWORD					m_dwMainImageBufferSize;

	void	DestroyMainPostImage();
	void    DestroyPreviewPostImage();

	// WESTY : Not sure if we even need to get social access key!
/*
	bool	GetSocialNetworkAccessKey( ESocialNetwork eSocialNetwork, DWORD dwUserIndex, bool bUsingKinect, DWORD dwUserTrackingIndex, bool bShowNetworkSignin );
*/

public:
	// Retrieve singleton instance.
	static CSocialManager* Instance();

	// To be called once during game init.
	void	Initialise();

	// Tick the social manager. Only does anything in async mode, polls for results of async actions.
	void	Tick();

	// May need to be called if something changes (i.e. player signs in to live ).
	bool	RefreshPostingCapability();

	// Returns true if any social newtork posting is allowed by us, false if not (if false, game must not display any social network UI).
	bool	IsTitleAllowedToPostAnything();

	// Returns true if we are allowed to post images to social networks.
	bool	IsTitleAllowedToPostImages();

	// Returns true if we are allowed to post links to social networks.
	bool	IsTitleAllowedToPostLinks();

	// Returns false if any of the live signed in users have disabled XPRIVILEGE_SOCIAL_NETWORK_SHARING
	bool	AreAllUsersAllowedToPostImages();

	// Post a test link to social network.
	bool	PostLinkToSocialNetwork( ESocialNetwork eSocialNetwork, DWORD dwUserIndex, bool bUsingKinect );

	// Post a test image to social network.
	bool	PostImageToSocialNetwork( ESocialNetwork eSocialNetwork, DWORD dwUserIndex, bool bUsingKinect );

	void	SetSocialPostText(LPCWSTR Title, LPCWSTR Caption, LPCWSTR Desc);

	// WESTY : Not sure if we even need to get social access key!
/*
	// We do not currently know what this is used for. We may not even need it?
	bool	ObtainSocialNetworkAccessKey( ESocialNetwork eSocialNetwork, DWORD dwUserIndex, bool bUsingKinect );
	*/

private:
	WCHAR m_wchTitleA[MAX_SOCIALPOST_CAPTION+1];
	WCHAR m_wchCaptionA[MAX_SOCIALPOST_CAPTION+1];
	WCHAR m_wchDescA[MAX_SOCIALPOST_DESC+1];

};

#endif //_SOCIAL_MANAGER_H
