#pragma once

enum eAwardType
{
	eAwardType_Achievement	= 0,
	eAwardType_GamerPic,
	eAwardType_Theme,
	eAwardType_AvatarItem,
};

enum eUpsellType
{
	eUpsellType_Custom = 0, // This is the default, and means that the upsell dialog was initiated in the app code
	eUpsellType_Achievement,
	eUpsellType_GamerPic,
	eUpsellType_Theme,
	eUpsellType_AvatarItem,
};

enum eUpsellResponse
{
	eUpsellResponse_Declined,
	eUpsellResponse_Accepted_NoPurchase,
	eUpsellResponse_Accepted_Purchase,
	eUpsellResponse_UserNotSignedInPSN,
	eUpsellResponse_NotAllowedOnline
};



class C_4JProfile
{
public:



	// 4 players have game defined data, puiGameDefinedDataChangedBitmask needs to be checked by the game side to see if there's an update needed - it'll have the bits set for players to be updated
	void				Initialise( const SceNpCommunicationId* commsId,
									const SceNpCommunicationSignature* commsSig,
									unsigned short usProfileVersion,
									UINT uiProfileValuesC,
									UINT uiProfileSettingsC,
									DWORD *pdwProfileSettingsA, 
									int iGameDefinedDataSizeX4,
									unsigned int *puiGameDefinedDataChangedBitmask); 
	void				InitialiseTrophies(const SceNpCommunicationId* commsId, const SceNpCommunicationSignature* commsSig);
	int					WaitTrophyInitComplete();
	int					tryWaitTrophyInitComplete();
	void				SetTrialTextStringTable(CXuiStringTable *pStringTable,int iAccept,int iReject);
	void				SetTrialAwardText(eAwardType AwardType,int iTitle,int iText); // achievement popup in the trial game
	int					GetLockedProfile();
	void				SetLockedProfile(int iProf);
	bool				IsSignedIn(int iQuadrant);
	bool				IsSignedInLive(int iProf);
	bool				IsGuest(int iQuadrant);
	UINT				RequestSignInUI(bool bFromInvite,bool bLocalGame,bool bNoGuestsAllowed,bool bMultiplayerSignIn,bool bAddUser, int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY);
	UINT				DisplayOfflineProfile(int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY);
	UINT				RequestConvertOfflineToGuestUI(int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY);
	void				SetPrimaryPlayerChanged(bool bVal);								
	bool				QuerySigninStatus(void);
	void				GetSceNpId(int iPad, SceNpId *npId);
	void				GetXUID(int iPad, PlayerUID *pXuid,bool bOnlineXuid);
	BOOL				AreXUIDSEqual(PlayerUID xuid1,PlayerUID xuid2);
	BOOL				XUIDIsGuest(PlayerUID xuid);
	bool				AllowedToPlayMultiplayer(int iProf);
	void				StartTrialGame(); // disables saves and leaderboard, and change state to readyforgame from pregame
	void				AllowedPlayerCreatedContent(int iPad, bool thisQuadrantOnly, BOOL *allAllowed, BOOL *friendsAllowed);
	BOOL				CanViewPlayerCreatedContent(int iPad, bool thisQuadrantOnly, PPlayerUID pXuids, DWORD dwXuidCount );
	bool				GetProfileAvatar(int iPad,int( *Func)(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes), LPVOID lpParam);
	void				CancelProfileAvatarRequest();

	void				SetGetStringFunc(LPCWSTR ( *Func)(int));
	void				SetPlayerListTitleID(int id);
	void				SetFatalTrophyErrorID(int id);
	void				SetSignInQuestionID(int id);

	// SYS
	int					GetPrimaryPad();
	void				SetPrimaryPad(int iPad);
	char*				GetGamertag(int iPad);
	wstring				GetDisplayName(int iPad);
	bool				IsFullVersion();
	void				SetFullVersion(bool bFull);
	void				SetSignInChangeCallback(void ( *Func)(LPVOID, bool, unsigned int),LPVOID lpParam);
	void				SetNotificationsCallback(void ( *Func)(LPVOID, DWORD, unsigned int),LPVOID lpParam);
	bool				RegionIsNorthAmerica(void);
	bool				LocaleIsUSorCanada(void);
	HRESULT				GetLiveConnectionStatus();
	bool				IsSystemUIDisplayed();
	void				SetProfileReadErrorCallback(void ( *Func)(LPVOID), LPVOID lpParam);

	void				SetHDDFreeKB(int iHDDFreeKB);
	void				SetMinSaveKB(int iMinSaveKB);
	int					GetHDDFreeKB(void);



	// PROFILE DATA
// 	int					SetDefaultOptionsCallback(int( *Func)(LPVOID,PROFILESETTINGS *, const int iPad),LPVOID lpParam);
// 	int					SetOldProfileVersionCallback(int( *Func)(LPVOID,unsigned char *, const unsigned short,const int),LPVOID lpParam);
// 	PROFILESETTINGS *	GetDashboardProfileSettings(int iPad);
// 	void				WriteToProfile(int iQuadrant, bool bGameDefinedDataChanged=false, bool bOverride5MinuteLimitOnProfileWrites=false);
// 	void				ForceQueuedProfileWrites(int iPad=XUSER_INDEX_ANY);
// 	void				*GetGameDefinedProfileData(int iQuadrant);
 	
	void				ResetProfileProcessState(); // after a sign out from the primary player, call this
	void				Tick( void );

	// ACHIEVEMENTS & AWARDS

	void				RegisterAward(int iAwardNumber,int iGamerconfigID, eAwardType eType, bool bLeaderboardAffected=false, 
										CXuiStringTable*pStringTable=NULL, int iTitleStr=-1, int iTextStr=-1, int iAcceptStr=-1, char *pszThemeName=NULL, unsigned int uiThemeSize=0L);
	int					GetAwardId(int iAwardNumber);
	eAwardType			GetAwardType(int iAwardNumber);
	bool				CanBeAwarded(int iQuadrant, int iAwardNumber);
	void				Award(int iQuadrant, int iAwardNumber, bool bForce=false);
	bool				IsAwardsFlagSet(int iQuadrant, int iAward);	
	void				Terminate();

	// RICH PRESENCE
	void				RichPresenceRegisterPresenceString(int index, const char* str);
	void				RichPresenceRegisterContext(int ctxID, const char* token);
	void				RichPresenceRegisterContextString(int ctxID, int strIndex, const char* str);

	void				RichPresenceInit(int iPresenceCount, int iContextCount);
	void				SetRichPresenceContextValue(int iPad,int iContextID, int iVal);
	void				SetCurrentGameActivity(int iPad,int iNewPresence, bool bSetOthersToIdle=false);
	void				SetRichPresenceSettingFn(int ( *SetPresenceInfoFn)(const void *data, unsigned int options));

	// PURCHASE
	void				DisplayFullVersionPurchase(bool bRequired, int iQuadrant, int iUpsellParam = -1);
	void				SetUpsellCallback(void ( *Func)(LPVOID lpParam, eUpsellType type, eUpsellResponse response, int iUserData),LPVOID lpParam);

	// Debug 
//	void				SetDebugFullOverride(bool bVal); // To override the license version (trail/full). Only in debug/release, not ContentPackage
	void				SetNetworkStatus(int status);

	DWORD				GetSignedInUsersMask();

	// PS3 chat and content restrictions
	bool				GetChatAndContentRestrictions(int iPad, bool thisQuadrantOnly,bool *pbChatRestricted,bool *pbContentRestricted,int *piAge);
	void				SetServiceID(char *pchServiceID); // needed for the ticket request for the chat restrictions of secondary PSN players
	void				HandleNetworkTicket(int result,void *arg);
	void				SetMinimumAge(int iAge, int iRegion);// 0 - SCEE, 1- SCEA, 2 - SCEJ

	void				SetGermanyMinimumAge(int iAge);
	void				SetRussiaMinimumAge(int iAge);
	void				SetAustraliaMinimumAge(int iAge);

	// Http calls
	bool SonyHttp_init();
	void SonyHttp_shutdown();
	bool SonyHttp_getDataFromURL(const char* szURL, void** ppOutData, int* pDataSize);
};

// Singleton
extern C_4JProfile ProfileManager;

