package system.item.skill;

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

/**
 * Classe que regula o funcionamento de status negativos como poison, burn, KO, etc.
 */
public class Affliction implements Jogada {

	/**
	 * Serve pra não dar merda na serialização de objetos.
	 */
	private static final long serialVersionUID = 5100839781727731891L;
	/**
	 * A duração em turnos deste status negativo. -1 para permanente (KO por exemplo).
	 */
	private int duration;
	/**
	 * Turnos passados com esta condição.
	 */
	private int durationElapsed;
	/**
	 * O identificador deste status negativo
	 */
	private int id;
	
	/**
	 * A alteração nos parâmetros do personagem afetado.
	 */
	private CharacterTraits traits = new CharacterTraits();

	/**
	 * O nome deste status
	 */
	private String name;
	/**
	 * A restrição do tipo de Skill causada por este status
	 */
	private String skillTypeRestriction;
	
	/**
	 * Se esse status é removido ao personagem
	 */
	private boolean removeIfRestricted;
	
	/**
	 * Cria um novo status negativo
	 * @param id - identificador do estado.
	 * @param duration - duração em turnos. -1 para KO.
	 * @param name - nome do estado.
	 */
	public Affliction(int id, int duration, String name) {
		this.id = id;
		this.duration = duration;
		this.name = name;
	}
	
	/**
	 * Reseta a quantia de turnos passados desta Affliction
	 * */
	public void resetDurationElapsed(){
		durationElapsed = 0;
	}
	
	/**
	 * Aumenta em 1 o número de turnos passados desta Afflictions.<br>
	 * Não passa turnos se a duração for -1 (KO)
	 * */
	public void incrementDurationElapsed(){
		if (durationElapsed < duration && duration != -1) {
			durationElapsed++;
		}
	}
	
	// Getters e setters
	
	public CharacterTraits getTraits() {
		return traits;
	}

	public int getDuration() {
		return duration;
	}

	public int getDurationElapsed() {
		return durationElapsed;
	}

	public int getId() {
		return id;
	}

	public String getName() {
		return name;
	}

	public String getSkillTypeRestriction() {
		return skillTypeRestriction;
	}

	public boolean isRemoveIfRestricted() {
		return removeIfRestricted;
	}
}
