#pragma once

#include "ItemStack.h"
#include "Area.h"

class Inventory;
class ItemSlotIDSetter
{
protected:
	virtual void setId(int id) = 0;

	friend Inventory;
};

class ItemSlot : public virtual Framework::ReferenceCounter, public ItemSlotIDSetter
{
private:
	ItemStack* items;
	int maxSize;
	Directions allowedPullSide;
	Directions allowedPushSides;
	int pullPriority;
	int pushPriority;
	bool allowHigherStackSize;
	Framework::Text name;
	int id;

	void setId(int id) override;

public:
	ItemSlot(Framework::Text name, int maxSize, int pullPriority, int pushPriority, int allowedPullSide, int allowedPushSides, bool allowHigherStackSize);
	~ItemSlot();

	ItemStack* takeItemsOut(int count, Direction dir);
	void addItems(ItemStack* zStack, Direction dir);

	int numberOfAddableItems(const ItemStack* zStack, Direction dir) const;
	const ItemStack* zStack() const;
	int getPullPriority() const;
	int getPushPriority() const;
	bool isFull() const;
	int getFreeSpace() const;
	bool isEmpty() const;
	int getNumberOfItems() const;
	const Framework::Text& getName() const;
	int getId() const;
};