/*==LICENSE==*

CyanWorlds.com Engine - MMOG client, server and tools
Copyright (C) 2011  Cyan Worlds, Inc.

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

You can contact Cyan Worlds, Inc. by email legal@cyan.com
 or by snail mail at:
      Cyan Worlds, Inc.
      14617 N Newport Hwy
      Mead, WA   99021

*==LICENSE==*/
//////////////////////////////////////////////////////////////////////
//
// pyVaultPlayerInfoListNode   - a wrapper class to provide interface to the RelVaultNode
//
//////////////////////////////////////////////////////////////////////

#include "pyVaultPlayerInfoListNode.h"
#ifndef BUILDING_PYPLASMA
#include "pyVault.h"
#endif
#include "pyVaultFolderNode.h"
#include "pyVaultPlayerInfoNode.h"
#include "pyVaultNodeRef.h"

#include "../plVault/plVault.h"

#include <algorithm>

// should only be created from C++ side
pyVaultPlayerInfoListNode::pyVaultPlayerInfoListNode(RelVaultNode* nfsNode)
: pyVaultFolderNode(nfsNode)
{
}

//create from the Python side
pyVaultPlayerInfoListNode::pyVaultPlayerInfoListNode(int n)
: pyVaultFolderNode(n)
{
	fNode->SetNodeType(plVault::kNodeType_PlayerInfoList);
}

//==================================================================
// class RelVaultNode : public plVaultFolderNode
//
hsBool pyVaultPlayerInfoListNode::HasPlayer( UInt32 playerID )
{
	if (!fNode)
		return false;

	NetVaultNode * templateNode = NEWZERO(NetVaultNode);
	templateNode->IncRef();
	templateNode->SetNodeType(plVault::kNodeType_PlayerInfo);
	VaultPlayerInfoNode access(templateNode);
	access.SetPlayerId(playerID);
	
	RelVaultNode * rvn = fNode->GetChildNodeIncRef(templateNode, 1);
	if (rvn)
		rvn->DecRef();
	
	templateNode->DecRef();
	return (rvn != nil);
}

hsBool pyVaultPlayerInfoListNode::AddPlayer( UInt32 playerID )
{
	if (HasPlayer(playerID))
		return true;
		
	if (!fNode)
		return false;
		
	NetVaultNode * templateNode = NEWZERO(NetVaultNode);
	templateNode->IncRef();
	templateNode->SetNodeType(plVault::kNodeType_PlayerInfo);
	VaultPlayerInfoNode access(templateNode);
	access.SetPlayerId(playerID);

	ARRAY(unsigned)	nodeIds;
	VaultLocalFindNodes(templateNode, &nodeIds);
	
	if (!nodeIds.Count())
		VaultFindNodesAndWait(templateNode, &nodeIds);
		
	if (nodeIds.Count())
		VaultAddChildNodeAndWait(fNode->nodeId, nodeIds[0], VaultGetPlayerId());
		
	templateNode->DecRef();
	return nodeIds.Count() != 0;
}

void pyVaultPlayerInfoListNode::RemovePlayer( UInt32 playerID )
{
	if (!fNode)
		return;

	NetVaultNode * templateNode = NEWZERO(NetVaultNode);
	templateNode->IncRef();
	templateNode->SetNodeType(plVault::kNodeType_PlayerInfo);
	VaultPlayerInfoNode access(templateNode);
	access.SetPlayerId(playerID);
			
	if (RelVaultNode * rvn = fNode->GetChildNodeIncRef(templateNode, 1)) {
		VaultRemoveChildNode(fNode->nodeId, rvn->nodeId, nil, nil);
		rvn->DecRef();
	}
	
	templateNode->DecRef();
}

PyObject * pyVaultPlayerInfoListNode::GetPlayer( UInt32 playerID )
{
	if (!fNode)
		PYTHON_RETURN_NONE;

	NetVaultNode * templateNode = NEWZERO(NetVaultNode);
	templateNode->IncRef();
	templateNode->SetNodeType(plVault::kNodeType_PlayerInfo);
	VaultPlayerInfoNode access(templateNode);
	access.SetPlayerId(playerID);

	PyObject * result = nil;
	if (RelVaultNode * rvn = fNode->GetChildNodeIncRef(templateNode, 1)) {
		result = pyVaultPlayerInfoNode::New(rvn);
		rvn->DecRef();
	}
	
	templateNode->DecRef();
	
	if (!result)
		PYTHON_RETURN_NONE;
		
	return result;
}


void pyVaultPlayerInfoListNode::Sort()
{
	hsAssert(false, "eric, port me");
}