/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * Additional copyright for this file:
 * Copyright (C) 1995-1997 Presto Studios, 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 2
 * 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, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 */

#include "pegasus/constants.h"
#include "pegasus/items/item.h"
#include "pegasus/items/inventory.h"

namespace Pegasus {

Inventory::Inventory() {
	_weightLimit = 100;
	_ownerID = kNoActorID;
	_referenceCount = 0;
}

Inventory::~Inventory() {
}

void Inventory::setWeightLimit(WeightType limit) {
	_weightLimit = limit;
	// *** What to do if the new weight limit is greater than the current weight?
}

WeightType Inventory::getWeight() {
	WeightType	result = 0;

	for (ItemIterator it = _inventoryList.begin(); it != _inventoryList.end(); it++)
		result += (*it)->getItemWeight();

	return result;
}

// If the item already belongs, just return kInventoryOK.
InventoryResult Inventory::addItem(Item *item) {
	if (itemInInventory(item))
		return kInventoryOK;

	if (getWeight() + item->getItemWeight() > _weightLimit)
		return kTooMuchWeight;

	_inventoryList.push_back(item);
	item->setItemOwner(_ownerID);

	++_referenceCount;
	return kInventoryOK;
}

InventoryResult Inventory::removeItem(Item *item) {
	for (ItemIterator it = _inventoryList.begin(); it != _inventoryList.end(); it++) {
		if (*it == item) {
			_inventoryList.erase(it);
			item->setItemOwner(kNoActorID);

			++_referenceCount;
			return kInventoryOK;
		}
	}

	return kItemNotInInventory;
}

InventoryResult Inventory::removeItem(ItemID id) {
	Item *item = findItemByID(id);

	if (item) {
		_inventoryList.remove(item);
		item->setItemOwner(kNoActorID);

		++_referenceCount;
		return kInventoryOK;
	}

	return kItemNotInInventory;
}

void Inventory::removeAllItems() {
	_inventoryList.clear();
	++_referenceCount;
}

bool Inventory::itemInInventory(Item *item) {
	for (ItemIterator it = _inventoryList.begin(); it != _inventoryList.end(); it++)
		if (*it == item)
			return true;

	return false;
}

bool Inventory::itemInInventory(ItemID id) {
	return findItemByID(id) != NULL;
}

Item *Inventory::getItemAt(int32 index) {
	int32 i = 0;
	for (ItemIterator it = _inventoryList.begin(); it != _inventoryList.end(); it++, i++)
		if (i == index)
			return *it;

	return 0;
}

ItemID Inventory::getItemIDAt(int32 index) {
	Item *item = getItemAt(index);

	if (item)
		return item->getObjectID();

	return kNoItemID;
}

Item *Inventory::findItemByID(ItemID id) {
	return _inventoryList.findItemByID(id);
}

// Return -1 if not found.

int32 Inventory::findIndexOf(Item *item) {
	uint32 i = 0;
	for (ItemIterator it = _inventoryList.begin(); it != _inventoryList.end(); it++, i++)
		if (*it == item)
			return i;

	return -1;
}

// Return -1 if not found.

int32 Inventory::findIndexOf(ItemID id) {
	uint32 i = 0;
	for (ItemIterator it = _inventoryList.begin(); it != _inventoryList.end(); it++, i++)
		if ((*it)->getObjectID() == id)
			return i;

	return -1;
}

WeightType Inventory::getWeightLimit() {
	return _weightLimit;
}

int32 Inventory::getNumItems() {
	return _inventoryList.size();
}

void Inventory::setOwnerID(const ActorID id) {
	_ownerID = id;
}

ActorID Inventory::getOwnerID() const {
	return _ownerID;
}

} // End of namespae Pegasus