//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: CWAPI header for GC access to the Web API server
//
//=============================================================================

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

#include "tier0/memdbgon.h"

enum EWebAPIPrivilege
{
	k_EWebApiPriv_Invalid				= -1,
	k_EWebApiPriv_None					= 0,			// fully public, no auth needed
	k_EWebApiPriv_Key					= 1,			// Requires valid key
	k_EWebApiPriv_PublisherKey			= 2,			// Requires publisher key
	k_EWebApiPriv_PublisherKeyOwnsApp	= 3,			// Requires publisher key and publisher owns appid
	//k_EWebApiPriv_Account	= 1,						// user must have a Steam account with password set
};

enum EWebApiParamType
{
	k_EWebApiParamTypeInvalid	= -1,

	k_EWebApiParamTypeInt32		= 0,
	k_EWebApiParamTypeUInt32	= 1,
	k_EWebApiParamTypeInt64		= 2,
	k_EWebApiParamTypeUInt64	= 3,
	k_EWebApiParamTypeFloat		= 4,
	k_EWebApiParamTypeString	= 5,
	k_EWebApiParamTypeBool		= 6,
	k_EWebApiParamTypeRawBinary = 7,
};

const char *PchNameFromEWebApiParamType( int eWebApiParamType );

typedef KeyValues *(*GCWebAPIInterfaceMapCreationFunc_t)();

class CGCWebAPIInterfaceMapRegistrar
{
public:
	CGCWebAPIInterfaceMapRegistrar( GCWebAPIInterfaceMapCreationFunc_t pFunc )
	{
		VecInstance().AddToTail( pFunc );
	}

	static CUtlVector< GCWebAPIInterfaceMapCreationFunc_t > & VecInstance();
};


//
// Macros for use registering interfaces in webapi_interfacemap.h
//
#define BEGIN_GCWEB_INTERFACE_BLOCK( pchInterfaceName ) \
	KeyValues *CreateWebAPIInterfaceMap_##pchInterfaceName() \
{ \
	KeyValues *pkvInterface = new KeyValues( #pchInterfaceName ); 

#define DECLARE_GCWEBAPI_METHOD( pchMethodName, unVersion, eHTTPMethod, pchJobName, ePriv ) \
{ \
	KeyValues *pkvMethod = pkvInterface->FindKey( pchMethodName #unVersion, true ); \
	pkvMethod->SetString( "name", pchMethodName ); \
	pkvMethod->SetInt( "version", unVersion ); \
	pkvMethod->SetInt( "http_method", eHTTPMethod ); \
	pkvMethod->SetString( "job_name", pchJobName); \
	pkvMethod->SetInt( "priv", ePriv ); 

#define REQUIRED_GCWEBAPI_PARAM( pchName, eType, pchDescription ) \
{ \
	KeyValues *pkvParams = pkvMethod->FindKey( "params", true ); \
	AssertMsg( Q_stricmp( pchName, "format" ) != 0, "'format' is a magic reserved API param for specifying output format!" ); \
	KeyValues *pkvParam = pkvParams->FindKey( pchName, true ); \
	pkvParam->SetString( "description", pchDescription ); \
	pkvParam->SetInt( "type", eType ); \
	pkvParam->SetInt( "optional", 0 ); \
}

#define OPTIONAL_GCWEBAPI_PARAM( pchName, eType, pchDescription ) \
{ \
	KeyValues *pkvParams = pkvMethod->FindKey( "params", true ); \
	AssertMsg( Q_stricmp( pchName, "format" ) != 0, "'format' is a magic reserved API param for specifying output format!" ); \
	KeyValues *pkvParam = pkvParams->FindKey( pchName, true ); \
	pkvParam->SetString( "description", pchDescription ); \
	pkvParam->SetInt( "type", eType ); \
	pkvParam->SetInt( "optional", 1 ); \
}

#define END_GCWEBAPI_METHOD() \
} 


#define END_GCWEB_INTERFACE_BLOCK( pchInterfaceName ) \
	return pkvInterface; \
} \
	CGCWebAPIInterfaceMapRegistrar g_Register_GCWebAPIInterfaceMapCreator_##pchInterfaceName( &CreateWebAPIInterfaceMap_##pchInterfaceName );

#include "tier0/memdbgoff.h"

#endif // GCWEBAPI_H