/*==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==*/
//////////////////////////////////////////////////////////////////////
//
// pyVaultPlayerNode   - a wrapper class to provide interface to the RelVaultNode
//
//////////////////////////////////////////////////////////////////////

#include "pyVaultPlayerNode.h"
#ifndef BUILDING_PYPLASMA
#include "pyVault.h"
#endif

#include "../pfPython/pyAgeInfoStruct.h"
#include "../pfPython/pyVaultAgeLinkNode.h"
#include "../pfPython/pyVaultPlayerInfoNode.h"
#include "../pfPython/pyVaultPlayerInfoListNode.h"
#include "../pfPython/pyVaultFolderNode.h"
#include "../pfPython/pyVaultChronicleNode.h"
#include "../pfPython/pyVaultSDLNode.h"
#include "../pfPython/pyAgeLinkStruct.h"

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

//============================================================================
static PyObject * GetPlayerVaultFolder (unsigned folderType) {
	PyObject * result = nil;
	if (RelVaultNode * rvnPlr = VaultGetPlayerNodeIncRef()) {
		if (RelVaultNode * rvnFldr = rvnPlr->GetChildFolderNodeIncRef(folderType, 1)) {
			result = pyVaultFolderNode::New(rvnFldr);
			rvnFldr->DecRef();
		}
		rvnPlr->DecRef();
	}
	
	return result;
}

pyVaultPlayerNode::pyVaultPlayerNode(RelVaultNode *nfsNode)
: pyVaultNode(nfsNode)
{
}

//create from the Python side
pyVaultPlayerNode::pyVaultPlayerNode()
: pyVaultNode(nil)	// may not create player nodes from python
{
}

//==================================================================
// class RelVaultNode : public plVaultNode
//
PyObject *pyVaultPlayerNode::GetInbox()
{
	if (PyObject * result = GetPlayerVaultFolder(plVault::kInboxFolder))
		return result;

	PYTHON_RETURN_NONE;
}

PyObject *pyVaultPlayerNode::GetAvatarOutfitFolder()
{
	if (PyObject * result = GetPlayerVaultFolder(plVault::kAvatarOutfitFolder))
		return result;

	PYTHON_RETURN_NONE;
}

PyObject *pyVaultPlayerNode::GetAvatarClosetFolder()
{
	if (PyObject * result = GetPlayerVaultFolder(plVault::kAvatarClosetFolder))
		return result;

	PYTHON_RETURN_NONE;
}

PyObject *pyVaultPlayerNode::GetChronicleFolder()
{
	if (PyObject * result = GetPlayerVaultFolder(plVault::kChronicleFolder))
		return result;

	PYTHON_RETURN_NONE;
}

PyObject *pyVaultPlayerNode::GetAgeJournalsFolder()
{
	if (PyObject * result = GetPlayerVaultFolder(plVault::kAgeJournalsFolder))
		return result;

	PYTHON_RETURN_NONE;
}

PyObject *pyVaultPlayerNode::GetIgnoreListFolder()
{
	if (PyObject * result = GetPlayerVaultFolder(plVault::kIgnoreListFolder))
		return result;

	PYTHON_RETURN_NONE;
}

PyObject *pyVaultPlayerNode::GetBuddyListFolder()
{
	if (PyObject * result = GetPlayerVaultFolder(plVault::kBuddyListFolder))
		return result;

	PYTHON_RETURN_NONE;
}

PyObject *pyVaultPlayerNode::GetPeopleIKnowAboutFolder()
{
	if (PyObject * result = GetPlayerVaultFolder(plVault::kPeopleIKnowAboutFolder))
		return result;

	PYTHON_RETURN_NONE;
}

PyObject *pyVaultPlayerNode::GetAgesICanVisitFolder()
{
	if (PyObject * result = GetPlayerVaultFolder(plVault::kAgesICanVisitFolder))
		return result;

	PYTHON_RETURN_NONE;
}

PyObject *pyVaultPlayerNode::GetAgesIOwnFolder()
{
	if (PyObject * result = GetPlayerVaultFolder(plVault::kAgesIOwnFolder))
		return result;

	PYTHON_RETURN_NONE;
}

PyObject *pyVaultPlayerNode::GetPlayerInfo()
{
	if (RelVaultNode * rvn = VaultGetPlayerInfoNodeIncRef()) {
		PyObject * result = pyVaultPlayerInfoNode::New(rvn);
		rvn->DecRef();
		return result;
	}

	PYTHON_RETURN_NONE;
}

PyObject *pyVaultPlayerNode::GetLinkToMyNeighborhood()
{
	plAgeLinkStruct * link = NEW(plAgeLinkStruct);
	
	if (VaultGetLinkToMyNeighborhood(link)) {
		PyObject * result = pyAgeLinkStruct::New(link);
		return result;
	}

	DEL(link);
	PYTHON_RETURN_NONE;
}

PyObject *pyVaultPlayerNode::GetLinkToCity()
{
	plAgeLinkStruct * link = NEW(plAgeLinkStruct);
	
	if (VaultGetLinkToCity(link)) {
		PyObject * result = pyAgeLinkStruct::New(link);
		return result;
	}

	DEL(link);
	PYTHON_RETURN_NONE;
}

PyObject *pyVaultPlayerNode::GetOwnedAgeLink(const pyAgeInfoStruct *info)
{
	plAgeLinkStruct link;
	if (VaultGetOwnedAgeLink(info->GetAgeInfo(), &link))
		return pyAgeLinkStruct::New(&link);
	
	PYTHON_RETURN_NONE;
}

void pyVaultPlayerNode::RemoveOwnedAgeLink(const char* ageFilename)
{
	plAgeInfoStruct info;
	info.SetAgeFilename(ageFilename);
	VaultUnregisterOwnedAgeAndWait(&info);
}

PyObject *pyVaultPlayerNode::GetVisitAgeLink(const pyAgeInfoStruct *info)
{
	if (RelVaultNode * rvn = VaultGetVisitAgeLinkIncRef(info->GetAgeInfo())) {
		PyObject * result = pyVaultAgeLinkNode::New(rvn);
		rvn->DecRef();
		return result;
	}

	PYTHON_RETURN_NONE;
}

void pyVaultPlayerNode::RemoveVisitAgeLink(const char *guidstr)
{
	Uuid uuid;
	GuidFromString(guidstr, &uuid);
	plAgeInfoStruct info;
	info.SetAgeInstanceGuid(&plUUID(uuid));
	VaultUnregisterOwnedAgeAndWait(&info);
}

PyObject *pyVaultPlayerNode::FindChronicleEntry(const char *entryName)
{
	wchar wStr[MAX_PATH];
	StrToUnicode(wStr, entryName, arrsize(wStr));
	if (RelVaultNode * rvn = VaultFindChronicleEntryIncRef(wStr)) {
		PyObject * result = pyVaultChronicleNode::New(rvn);
		rvn->DecRef();
		return result;
	}

	PYTHON_RETURN_NONE;
}

void pyVaultPlayerNode::SetPlayerName(const char *value)
{
	hsAssert(false, "python may not change a player's name this way");
}

std::string pyVaultPlayerNode::GetPlayerName()
{
	if (!fNode)
		return "";

	VaultPlayerNode player(fNode);
	char ansiStr[MAX_PATH];		
	StrToAnsi(ansiStr, player.playerName, arrsize(ansiStr));
	return ansiStr;
}

void pyVaultPlayerNode::SetAvatarShapeName(const char *value)
{
	hsAssert(false, "python may not change a player's avatar this way");
}

std::string pyVaultPlayerNode::GetAvatarShapeName()
{
	if (!fNode)
		return "";

	VaultPlayerNode player(fNode);
	char ansiStr[MAX_PATH];		
	StrToAnsi(ansiStr, player.avatarShapeName, arrsize(ansiStr));
	return ansiStr;
}

void pyVaultPlayerNode::SetDisabled(bool value)
{
	hsAssert(false, "python may not change a player's disable state this way");
}

bool pyVaultPlayerNode::IsDisabled()
{
	if (!fNode)
		return false;

	VaultPlayerNode player(fNode);
	return player.disabled;
}

void pyVaultPlayerNode::SetOnlineTime(UInt32 value)
{
	hsAssert(false, "python may not change a player's online time this way");
}

UInt32 pyVaultPlayerNode::GetOnlineTime()
{
	if (!fNode)
		return 0;

	VaultPlayerNode player(fNode);
	return player.onlineTime;
}

void pyVaultPlayerNode::SetExplorer (bool b) {
	if (!fNode)
		return;

	VaultPlayerNode player(fNode);
	player.SetExplorer(b);
}

hsBool pyVaultPlayerNode::IsExplorer () {
	if (!fNode)
		return false;

	VaultPlayerNode player(fNode);
	return player.explorer;
}