//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: declares a variety of constants
//
// $NoKeywords: $
//=============================================================================

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

#include "steam/steamtypes.h"
#include "tier0/t0constants.h"
#include "gamecoordinator/igcsqlquery.h"

namespace GCSDK
{

//-----------------------------------------------------------------------------
// Timing constants
//-----------------------------------------------------------------------------

// How long each frame should last
const int k_cMicroSecPerShellFrame = 50 * k_nThousand;

// How many frames per second should we have
const uint32 k_cFramesPerSec = k_nMillion / k_cMicroSecPerShellFrame;

// Task granularity -- the longest time in microseconds you should spend without yielding
const int k_cMicroSecTaskGranularity = 5 * k_nThousand;

// If a frame runs longer than it's supposed to (which they always will by at least a little),
// we subtract the overage from the next frame.  This is the maximum amount to correct each frame.
const int k_cMicroSecMaxFrameCorrection = 25 * k_nThousand;

// if server time is too far behind, we will start skipping frames to re-synchronize it with real time
const int k_cMicroSecBehindToStartFrameSkipping = (k_nMillion * 2);

// Default Max time to allow a job to be blocked on I/O
const int k_cMicroSecJobPausedTimeout = 20 * k_nMillion;

// How much time a job should run before heartbeating
const int k_cMicroSecJobHeartbeat = k_cMicroSecJobPausedTimeout / 4;

// Default Max number of job heartbeat intervals to allow a job to be blocked on I/O
const int k_cJobHeartbeatsBeforeTimeoutDefault = k_cMicroSecJobPausedTimeout / k_cMicroSecJobHeartbeat;

// Number of seconds to take to cycle through all active sessions
const int k_nUserSessionRunInterval = 5 * k_nMillion;
const int k_nGSSessionRunInterval = 5 * k_nMillion;
const int k_nAccountDetailsRunInterval = 30 * k_nMillion;
const int k_nLocksRunInterval = 120 * k_nMillion;

// Time to keep an unused lock before removing it
const uint64 k_cMicroSecLockLifetime = (uint64)k_nSecondsPerHour * (uint64)k_nMillion;

//-----------------------------------------------------------------------------
// Server types
//-----------------------------------------------------------------------------
// EServerType
// Specifies the type of a specific server
// MUST BE KEPT IN SYNC with g_rgchServerTypeName !!! 
enum EServerType
{
	k_EServerTypeInvalid = -1,

	k_EServerTypeShell = 0,
	k_EServerTypeGC = 1,
	k_EServerTypeGCClient = 2,

	// Must be last!!!
	k_EServerTypeMax = 2,
};
const EServerType k_EServerTypeFirst = k_EServerTypeShell;


//-----------------------------------------------------------------------------
// Alert constants
//-----------------------------------------------------------------------------
enum EAlertType
{
	k_EAlertTypeAssert,
	k_EAlertTypeInfo,
	k_EAlertTypeReport,
};

//-----------------------------------------------------------------------------
// Spew / EmitEvent constants
//-----------------------------------------------------------------------------

#define SPEW_ALWAYS 1
#define SPEW_NEVER 5

#define LOG_ALWAYS 1
#define LOG_NEVER 5


//-----------------------------------------------------------------------------
// string constants
//-----------------------------------------------------------------------------

const char k_rgchUnknown[] = "Unknown";

#ifdef GC
//-----------------------------------------------------------------------------
// SQL constants
//-----------------------------------------------------------------------------

const int k_cSQLObjectNameMax = 128;			// max length of a SQL identifier (column name, index name, table name ... )
const int k_cchSQLStatementTextMax = 8192;		// nominal max length of a SQL statement
const uint32 k_cubRecordMax = 4 * k_nMillion;				// Max size of a single record
const uint32 k_cubVarFieldMax = 1 * k_nMillion;			// Max size of a variable-length field
const int k_cMaxCol = 50;
const uint32 k_cMaxBindParams = 500;				// the largest number of bind parameters allowed in a single query
const uint32 k_cMaxFreeBindParamBuffers = 2000;		// How many bind param buffers should we leave free before we start deleting some
const uint32 k_cMaxFreeBindWebAPIBuffers = 32;		// How many WebAPI buffers should we leave free before we start deleting some

// iTable constants
const int k_iTableNil = -1;		// No table at all
const int k_iFieldNil = -1;		// No field at all


enum EForeignKeyAction
{
	k_EForeignKeyActionNoAction	= 0,
	k_EForeignKeyActionCascade	= 1,
	k_EForeignKeyActionSetNULL	= 2,
};
const char *PchNameFromEForeignKeyAction( EForeignKeyAction eForeignKeyAction );
EForeignKeyAction EForeignKeyActionFromName( const char *pchName );

const char *PchNameFromEGCSQLType( EGCSQLType eForeignKeyAction );

#ifndef SQLRETURN
typedef short SQLRETURN;
#endif // SQLRETURN
#endif // GC


//-----------------------------------------------------------------------------
// WebAPI constants
//-----------------------------------------------------------------------------

const uint32 k_cubWebAPIKey = 16;									// size of the web api key
const uint32 k_cchWebAPIKeyStringMax = (k_cubWebAPIKey * 2) + 1;	// size of string representing web API key (hex encoded so twice the size + NUL)
typedef	unsigned char WebAPIKey_t[ k_cubWebAPIKey ];

// used to revoke WebAPI keys.  Stored in the database... do not reorder.
enum EWebAPIKeyStatus
{
	k_EWebAPIKeyValid = 0,
	k_EWebAPIKeyRevoked = 1,

	k_EWebAPIKeyInvalid = 255,
};


//-----------------------------------------------------------------------------
// Game Server constants
//-----------------------------------------------------------------------------

const uint32 k_cubGameServerToken = 16;									// size of the game server identity token key
const uint32 k_cchGameServerTokenStringMax = (k_cubGameServerToken * 2) + 1;	// size of string representing game server identity token (hex encoded so twice the size + NUL)
typedef	unsigned char GameServerIdentityToken_t[ k_cubGameServerToken ];



//-----------------------------------------------------------------------------
// Other constants
//-----------------------------------------------------------------------------

const int k_cSmallBuff = 255;					// smallish buffer 
const int k_cMedBuff = 1024;					// medium buffer 

const int k_cubMsgSizeSmall = 512;				// small sized packet

const int k_cInitialNetworkBuffers = 10;		// # of network buffers to see the system with

const int k_cubMaxExpectedMsgDataSize = 5 * k_nMegabyte;// the maximum application data that we EXPECT to be sent in a single message

#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define FILE_AND_LINE __FILE__ ":" TOSTRING(__LINE__)	

// Default capacity for session hash tables
const int k_cGCUserSessionInit = 10 * k_nThousand;		// Can grow indefinitely by this increment
const int k_cBucketGCUserSession = 100 * k_nThousand;			// Fixed size
const int k_cGCGSSessionInit = 1 * k_nThousand;		// Can grow indefinitely by this increment
const int k_cBucketGCGSSession = 10 * k_nThousand;			// Fixed size
const int k_cAccountDetailsInit = 10 * k_nThousand;		// Can grow indefinitely by this increment
const int k_cBucketAccountDetails = 100 * k_nThousand;			// Fixed size
const int k_cGCLocksInit = 50 * k_nThousand;		// Can grow indefinitely by this increment
const int k_cBucketGCLocks = 500 * k_nThousand;			// Fixed size

const char *PchNameFromEUniverse( EUniverse eUniverse );
EUniverse EUniverseFromName( const char *pchName );

} // namespace GCSDK

#endif // GCCONSTANTS_H