package system.item;

import br.ufsc.inf.leobr.cliente.Jogada;
import system.character.CharacterTraits;
import system.item.skill.Skill;

/**
 * Especialização da classe Item que permite os personagens interagir com armas, armaduras e 
 * consumíveis que alteram seus atributos, entre outras funções.
 */
public class Equipment extends Item implements Jogada {
	/**
	 * Serve pra não dar merda na serialização de objetos.
	 */
	private static final long serialVersionUID = -4141792718166405514L;
	
	/**
	 * O preço normal do equipamento, se vende ele pela metade do preço.
	 */
	private int price;
	/**
	 * A quantidade disponível que pode ser equipada. Nunca pode ser maior que quantity.
	 */
	private int equipableQuantity;
	/**
	 * A quantidade deste equipamento no inventário.
	 */
	private int quantity;
	
	/**
	 * O Tipo do equipamento. É definido quando é construído.<br>
	 * São valores válildos:<br><br>
	 * weapon<br>
	 * armor<br>
	 * consumable<br>
	 */
	private String equipmentType; 
	
	/**
	 * Define se o equipamento pode ser consumido, como uma poção por exemplo.
	 */
	private boolean consumable;
	
	/**
	 * Os bônus e penalidades que este equipamento causa no personagem que o equipa.
	 */
	private CharacterTraits traits;
	
	/**
	 * As habilidades que este equipamento possui. Quando ele for equipado o personagem<br>
	 * terá acesso a tais habilidades.<br>
	 * Consumíveis só podem ter uma única habilidade porque são destruídos após uso.
	 */
	private Skill[] skills;
	
	/**
	 * Inicializa uma "stack" de um determinado Equipment. Fica esperto que essa não é só uma unidade de um equipamento.
	 * @param id o identificador do Equipment
	 * @param name o nome do Equipment
	 * @param description a descrição do Equipment
	 * @param equipmentType valores válidos:<br>weapon, armor
	 * @param traits os bônus de atributos deste equipamento
	 * @param skills as Skills que ele oferece quando equipado
	 */
	public Equipment(int id, String name, String description, String equipmentType, CharacterTraits traits, Skill[] skills) {
		this.id = id;
		this.name = name;
		this.description = description;
		this.equipmentType = equipmentType;
		this.traits = traits;
		this.skills = skills;
	}

	/**
	 * Inicializa uma "stack" de um determinado Equipment determinado como consumível.
	 * Fica esperto que essa não é só uma unidade de um equipamento.
	 * @param id o identificador do Equipment
	 * @param name o nome do Equipment
	 * @param description a descrição do Equipment
	 * @param skills a Skill que ele executa quando consumido
	 */
	public Equipment(int id, String name, String description, Skill[] skill) {
		this.id = id;
		this.name = name;
		this.description = description;
		this.skills = skill;
		equipmentType = "consumable";
		consumable = true;
	}
	
	// Checa se dá de consumir o equipamento
	public boolean useable() {
		if (consumable && quantity > 0) {
			return true;
		} else {
			return false;
		}
	}
	
	// Decrementa a quantia total
	// TODO FICA ESPERTO AQUI
	public void use() {
		if (useable()) {
			quantity--;
			equipableQuantity--;
		}
	}
	
	// Decrementa a quantia equipável
	public void equip() {
		if (equipableQuantity > 0) {
			equipableQuantity--;
		}
	}
	
	// Decrementa a quantia equipável
	public void unequip() {
		equipableQuantity++;
	}
	
	// Decrementa as quantidades
	public void sell() {
		if (quantity > 0) {
			quantity--;
			equipableQuantity--;			
		}
	}
	
	/**
	 * Retorna a skill do equipamento se ele for um consumível.
	 * @return a Skill do item, null caso contrário.
	 */
	public Skill getConsumableSkill() {
		if (consumable) {
			return skills[0];
		} else {
			return null;
		}
	}

	public CharacterTraits getTraits() {
		return traits;
	}

	
	public int getPrice() {
		return price;
	}
	

	public int getEquipableQuantity() {
		return equipableQuantity;
	}
	

	public int getQuantity() {
		return quantity;
	}
	

	public String getEquipmentType() {
		return equipmentType;
	}
	

	public boolean isConsumable() {
		return consumable;
	}
	

	public Skill[] getSkills() {
		return skills;
	}
}
