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

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


#include "utlvector.h"


struct ChallengeDescription_t
{
	char szName[32];
	char szComment[256];

	int iType;

	int iBronze;
	int iSilver;
	int iGold;

	int iBest;
};

struct BonusMapDescription_t
{
	bool bIsFolder;

	char szShortName[64];
	char szFileName[128];

	char szMapFileName[128];
	char szChapterName[128];
	char szImageName[128];

	char szMapName[64];
	char szComment[256];

	bool bLocked;
	bool bComplete;

	CUtlVector<ChallengeDescription_t>	*m_pChallenges;

	BonusMapDescription_t( void )
	{
		bIsFolder = false;

		szShortName[ 0 ] = '\0';
		szFileName[ 0 ] = '\0';

		szMapFileName[ 0 ] = '\0';
		szChapterName[ 0 ] = '\0';
		szImageName[ 0 ] = '\0';

		szMapName[ 0 ] = '\0';
		szComment[ 0 ] = '\0';

		bLocked = false;
		bComplete = false;

		m_pChallenges = NULL;
	}
};

struct BonusMapChallenge_t
{
	char szFileName[128];
	char szMapName[32];
	char szChallengeName[32];
	int iBest;
};


class KeyValues;


//-----------------------------------------------------------------------------
// Purpose: Keeps track of bonus maps on disk
//-----------------------------------------------------------------------------
class CBonusMapsDatabase
{

public:
	CBonusMapsDatabase( void );
	~CBonusMapsDatabase();

	bool ReadBonusMapSaveData( void );
	bool WriteSaveData( void );

	const char * GetPath( void ) { return m_szCurrentPath; }
	void RootPath( void );
	void AppendPath( const char *pchAppend );
	void BackPath( void );
	void SetPath( const char *pchPath, int iDirDepth );

	void ClearBonusMapsList( void );
	void ScanBonusMaps( void );
	void RefreshMapData( void );

	int BonusCount( void );
	BonusMapDescription_t * GetBonusData( int iIndex ) { return &(m_BonusMaps[ iIndex ]); }
	int InvalidIndex( void ) { return m_BonusMaps.InvalidIndex(); }
	bool IsValidIndex( int iIndex ) { return m_BonusMaps.IsValidIndex( iIndex ); }

	bool GetBlink( void );
	void SetBlink( bool bState );

	bool BonusesUnlocked( void );

	void SetCurrentChallengeNames( const char *pchFileName, const char *pchMapName, const char *pchChallengeName );
	void GetCurrentChallengeNames( char *pchFileName, char *pchMapName, char *pchChallengeName );
	void SetCurrentChallengeObjectives( int iBronze, int iSilver, int iGold );
	void GetCurrentChallengeObjectives( int &iBronze, int &iSilver, int &iGold );

	bool SetBooleanStatus( const char *pchName, const char *pchFileName, const char *pchMapName, bool bValue );
	bool SetBooleanStatus( const char *pchName, int iIndex, bool bValue );
	bool UpdateChallengeBest( const char *pchFileName, const char *pchMapName, const char *pchChallengeName, int iBest );

	float GetCompletionPercentage( void );

	int NumAdvancedComplete( void );
	void NumMedals( int piNumMedals[ 3 ] );

private:

	void AddBonus( const char *pCurrentPath, const char *pDirFileName, bool bIsFolder );
	void BuildSubdirectoryList( const char *pCurrentPath, bool bOutOfRoot );
	void BuildBonusMapsList( const char *pCurrentPath, bool bOutOfRoot );

	void ParseBonusMapData( char const *pszFileName, char const *pszShortName, bool bIsFolder );

private:

	KeyValues	*m_pBonusMapsManifest;

	CUtlVector<BonusMapDescription_t>	m_BonusMaps;

	KeyValues	*m_pBonusMapSavedData;
	bool		m_bSavedDataChanged;

	int		m_iX360BonusesUnlocked;		// Only used on 360
	bool	m_bHasLoadedSaveData;

	int		m_iDirDepth;
	char	m_szCurrentPath[_MAX_PATH];
	float	m_fCurrentCompletion;
	int		m_iCompletableLevels;

	BonusMapChallenge_t		m_CurrentChallengeNames;
	ChallengeDescription_t	m_CurrentChallengeObjectives;
};


void GetChallengeMedals( ChallengeDescription_t *pChallengeDescription, int &iBest, int &iEarnedMedal, int &iNext, int &iNextMedal );
CBonusMapsDatabase *BonusMapsDatabase( void );

extern const char g_pszMedalNames[4][8];


#endif // BONUSMAPSDATABASE_H