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

#include "map_shared.h"
#include "bsplib.h"
#include "cmdlib.h"


CMapError g_MapError;
int g_nMapFileVersion;


//-----------------------------------------------------------------------------
// Purpose: 
// Input  : *szKey - 
//			*szValue - 
//			*pLoadEntity - 
// Output : ChunkFileResult_t
//-----------------------------------------------------------------------------
ChunkFileResult_t LoadEntityKeyCallback(const char *szKey, const char *szValue, LoadEntity_t *pLoadEntity)
{
	if (!stricmp(szKey, "classname"))
	{
		if (!stricmp(szValue, "func_detail"))
		{
			pLoadEntity->nBaseContents = CONTENTS_DETAIL;
		}
		else if (!stricmp(szValue, "func_ladder"))
		{
			pLoadEntity->nBaseContents = CONTENTS_LADDER;
		}
		else if (!stricmp(szValue, "func_water"))
		{
			pLoadEntity->nBaseContents = CONTENTS_WATER;
		}
	}
	else if (!stricmp(szKey, "id"))
	{
		// UNDONE: flag entity errors by ID instead of index
		//g_MapError.EntityState( atoi( szValue ) );
		// rename this field since DME code uses this name
		SetKeyValue( pLoadEntity->pEntity, "hammerid", szValue );
		return(ChunkFile_Ok);
	}
	else if( !stricmp( szKey, "mapversion" ) )
	{
		// .vmf map revision number
		g_MapRevision = atoi( szValue );
		SetKeyValue( pLoadEntity->pEntity, szKey, szValue );
		return ( ChunkFile_Ok );
	}

	SetKeyValue( pLoadEntity->pEntity, szKey, szValue );

	return(ChunkFile_Ok);
}


static ChunkFileResult_t LoadEntityCallback( CChunkFile *pFile, int nParam )
{
	if (num_entities == MAX_MAP_ENTITIES)
	{
		// Exits.
		g_MapError.ReportError ("num_entities == MAX_MAP_ENTITIES");
	}

	entity_t *mapent = &entities[num_entities];
	num_entities++;
	memset(mapent, 0, sizeof(*mapent));
	mapent->numbrushes = 0;

	LoadEntity_t LoadEntity;
	LoadEntity.pEntity = mapent;

	// No default flags/contents
	LoadEntity.nBaseFlags = 0;
	LoadEntity.nBaseContents = 0;

	//
	// Read the entity chunk.
	//
	ChunkFileResult_t eResult = pFile->ReadChunk((KeyHandler_t)LoadEntityKeyCallback, &LoadEntity);

	return eResult;
}


bool LoadEntsFromMapFile( char const *pFilename )
{
	//
	// Dummy this up for the texture handling. This can be removed when old .MAP file
	// support is removed.
	//
	g_nMapFileVersion = 400;

	//
	// Open the file.
	//
	CChunkFile File;
	ChunkFileResult_t eResult = File.Open( pFilename, ChunkFile_Read );

	if(eResult == ChunkFile_Ok)
	{
		num_entities = 0;

		//
		// Set up handlers for the subchunks that we are interested in.
		//
		CChunkHandlerMap Handlers;
		Handlers.AddHandler("entity", (ChunkHandler_t)LoadEntityCallback, 0);

		File.PushHandlers(&Handlers);

		//
		// Read the sub-chunks. We ignore keys in the root of the file.
		//
		while (eResult == ChunkFile_Ok)
		{
			eResult = File.ReadChunk();
		}

		File.PopHandlers();
		return true;
	}
	else
	{
		Error("Error in LoadEntsFromMapFile (in-memory file): %s.\n", File.GetErrorText(eResult));
		return false;
	}
}