// Copyright (C) 2007 Id Software, Inc.
//

#if !defined( __SDNETSTATSMANAGER_H__ )
#define __SDNETSTATSMANAGER_H__

//===============================================================
//
//	sdNetStatsManager
//
//===============================================================

struct sdNetStatKeyValue {
	enum statValueType {
		SVT_INT,
		SVT_FLOAT,
		SVT_INT_MAX,
		SVT_FLOAT_MAX,
	};

	union valueData_t {
		int		i;
		float	f;
	};

	sdNetStatKeyValue( void ) {
		key = NULL;
	}

	sdNetStatKeyValue( const sdNetStatKeyValue& rhs ) {
		key = NULL;
		*this = rhs;
	}

	void operator=( const sdNetStatKeyValue& rhs ) {
		ClearString();

		if ( rhs.key != NULL ) {
			key = rhs.key->GetPool()->AllocString( rhs.key->c_str() );
		} else {
			key = NULL;
		}

		type = rhs.type;
		val = rhs.val;
	}

	~sdNetStatKeyValue( void ) {
		ClearString();
	}

	void ClearString( void ) {
		if ( key != NULL ) {
			key->GetPool()->FreeString( key );
		}
		key = NULL;
	}

	const idPoolStr*	key;
	statValueType		type;
	valueData_t			val;
};

typedef idList< sdNetStatKeyValue > sdNetStatKeyValList;

#if !defined( SD_DEMO_BUILD )

class sdNetTask;
struct sdNetClientId;

/*struct sdNetStatLeaderBoardEntry {
	unsigned int
};*/

class sdNetStatsManager {
public:
	virtual					~sdNetStatsManager() {}

	// Write a stats dictionary for a specific client
	virtual bool			WriteDictionary( const sdNetClientId& clientId, const sdNetStatKeyValList& stats ) = 0;

	// Read the stats back that have already been stored for a specific client ( reconnecting clients )
	virtual bool			ReadCachedDictionary( const sdNetClientId& clientId, sdNetStatKeyValList& stats ) = 0;

	//
	// Online functionality
	//

	// Flush pending stats to the master
	virtual sdNetTask*		Flush() = 0;

	// Read a stats dictionary from the master
	virtual sdNetTask*		ReadDictionary( const sdNetClientId& clientId, sdNetStatKeyValList& stats ) = 0;
};

#endif /* !SD_DEMO_BUILD */

#endif /* !__SDNETSTATSMANAGER_H__ */
