#ifndef ITEM_H
#define ITEM_H
#include "pixelGameEngine.h"
using namespace olc;
#include "battle.h"
#include "defines.h"

enum class ItemName{
	COOKIE,
	EGG,
	PIZZA,
	MIRACLE_FOOD_LUNCH,
	CRACKED_BAT,
	TEE_BALL_BAT,
	LIGHT_JACKET,
	HEAVY_JACKET,
	COPPER_BRACELET,
	KEY_TO_THE_PALACE,
	BOMB,
	FREEZE_PACKET,
	SOME_STUPIDLY_LONG_FEATHER,
};

namespace EquipSlot{
	enum Equip{
		WEAPON,
		ARMOR,
		ACCESSORY,
		NONE
	};
}

namespace Consumable{
	enum{
		FRIENDLY,
		ENEMY,
		FRIENDLY_PERMANENT, //This item does not get used up when used.
		ENEMY_PERMANENT, //This item does not get used up when used.
		NOT_A_CONSUMABLE
	};
}

enum class ItemAction{
	HPRECOVERY,
	PPRECOVERY,
	ATKINCREASE,
	HPINCREASE,
	PPINCREASE,
	SPDINCREASE,
	LEARNMOVE,
};

struct ItemStatsStruct{
	int hpRecovery=0;
	int ppRecovery=0;
	int atkIncrease=0;
	int spdIncrease=0;
	int hpIncrease=0;
	int ppIncrease=0;
	Battle::Move*learnAbility=nullptr;
	int damage=0;
	int rollDmg=0;
	int attack=0;
	int defense=0;
	EquipSlot::Equip equip=EquipSlot::NONE; //Whether or not this is equipment.
	bool important=false; //If an item's important it can't be discarded.
	int consumable=Consumable::NOT_A_CONSUMABLE; //Whether or not this item is consumed when used.
	int sellPrice=0;
};

struct CustomItemMessage{
	std::string s="";
	ItemAction a=ItemAction::HPRECOVERY;
};

class Item{
	public:
		ItemName id;
		std::string name;
		std::string description;
		Battle::Move*battlemove=nullptr;
		ItemStatsStruct stats;
		int dropChance=8; //1 out of dropChance change of item dropping.
		std::vector<CustomItemMessage> messages;
		Item(ItemName id,std::string name,std::string desc,int dropChance=8,ItemStatsStruct stats={hpRecovery:0,ppRecovery:0,atkIncrease:0,spdIncrease:0,hpIncrease:0,ppIncrease:0,learnAbility:nullptr,damage:0,rollDmg:0,attack:0,defense:0,equip:EquipSlot::NONE,important:false,consumable:Consumable::NOT_A_CONSUMABLE},Battle::Move*battlemove=nullptr)
		:id(id),name(name),description(desc),stats(stats),dropChance(dropChance),battlemove(battlemove){
			if (stats.hpRecovery) {messages.push_back({"$TARGET recovers "+std::to_string(stats.hpRecovery)+" HP.",ItemAction::HPRECOVERY});}
			if (stats.ppRecovery) {messages.push_back({"$TARGET recovers "+std::to_string(stats.ppRecovery)+" PP.",ItemAction::PPRECOVERY});}
			if (stats.atkIncrease) {messages.push_back({"$TARGET gains "+std::to_string(stats.atkIncrease)+" ATK point"+(stats.atkIncrease==1?"":"s")+".",ItemAction::ATKINCREASE});}
			if (stats.hpIncrease) {messages.push_back({"$TARGET gains "+std::to_string(stats.hpIncrease)+" HP point"+(stats.hpIncrease==1?"":"s")+".",ItemAction::HPINCREASE});}
			if (stats.ppIncrease) {messages.push_back({"$TARGET gains "+std::to_string(stats.ppIncrease)+" PP point"+(stats.ppIncrease==1?"":"s")+".",ItemAction::PPINCREASE});}
			if (stats.spdIncrease) {messages.push_back({"$TARGET gains "+std::to_string(stats.spdIncrease)+" SPD point"+(stats.spdIncrease==1?"":"s")+".",ItemAction::SPDINCREASE});}
			if (stats.learnAbility!=nullptr) {messages.push_back({"$TARGET gains the ability to use "+stats.learnAbility->name+" "+((stats.learnAbility->grade!=0)?std::string(1,stats.learnAbility->grade):"")+"!",ItemAction::LEARNMOVE});}
		}
};
#endif