package joshie.progression.criteria;
import com.google.gson.JsonObject;
import joshie.progression.Progression;
import joshie.progression.api.criteria.IConditionProvider;
import joshie.progression.api.criteria.ICriteria;
import joshie.progression.api.criteria.ITrigger;
import joshie.progression.api.criteria.ITriggerProvider;
import joshie.progression.api.special.*;
import joshie.progression.helpers.JSONHelper;
import net.minecraft.item.ItemStack;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import static net.minecraft.util.text.TextFormatting.*;
public class Trigger implements ITriggerProvider {
private final ITrigger trigger;
private final String unlocalised;
private final int color;
private ICriteria criteria;
private UUID uuid;
private ItemStack stack;
private List<IConditionProvider> conditions;
private boolean isCancelable = false;
public boolean isCanceling = false;
public boolean isVisible = true;
//Dummy constructor for storing the default values
public Trigger(ITrigger trigger, String unlocalised, int color) {
this.trigger = trigger;
this.unlocalised = unlocalised;
this.color = color;
this.trigger.setProvider(this);
}
public Trigger(ICriteria criteria, UUID uuid, ITrigger trigger, ItemStack stack, String unlocalised, int color, boolean isCancelable) {
this.criteria = criteria;
this.uuid = uuid;
this.trigger = trigger;
this.unlocalised = unlocalised;
this.color = color;
this.stack = stack;
this.trigger.setProvider(this);
this.conditions = new ArrayList();
this.isCancelable = isCancelable;
}
@Override
public ITriggerProvider copy() {
Trigger copy = new Trigger(criteria, uuid, trigger.copy(), stack, unlocalised, color, isCancelable);
copy.conditions = conditions; //We can point to the same conditions as it doesn't matter
copy.isCanceling = isCanceling;
copy.isVisible = isVisible;
return copy;
}
@Override
public ICriteria getCriteria() {
return criteria;
}
@Override
public ITrigger getProvided() {
return trigger;
}
@Override
public List<IConditionProvider> getConditions() {
return conditions;
}
@Override
public boolean isCancelable() {
return isCancelable;
}
public boolean isCanceling() {
return isCanceling;
}
@Override
public String getUnlocalisedName() {
return unlocalised;
}
@Override
public int getColor() {
return color;
}
@Override
public ItemStack getIcon() {
ItemStack result = trigger instanceof ICustomIcon ? ((ICustomIcon)trigger).getIcon(): stack;
return result == null ? stack: result;
}
@Override
public String getLocalisedName() {
return trigger instanceof ICustomDisplayName ? ((ICustomDisplayName)trigger).getDisplayName() : Progression.translate(getUnlocalisedName());
}
private String getTriggerDescription() {
String ret = (trigger instanceof ICustomDescription ? ((ICustomDescription)trigger).getDescription() : Progression.format(getUnlocalisedName() + ".description")) + "\n\n";
if (trigger instanceof ICountable) {
ICountable countable = ((ICountable)trigger);
ret = ret + BLUE + countable.getCounter() + "/" + countable.getRequirement() + RESET + "\n\n";
}
return ret;
}
@Override
public String getDescription() {
if(isCancelable && isCanceling) return Progression.format(getUnlocalisedName() + ".cancel");
else return getTriggerDescription() + GREEN + Progression.format("completed", trigger.getPercentage());
}
@Override
public int getWidth(DisplayMode mode) {
return trigger instanceof ICustomWidth ? ((ICustomWidth)trigger).getWidth(mode) : 100;
}
@Override
public UUID getUniqueID() {
if (uuid == null) {
uuid = UUID.randomUUID();
}
return uuid;
}
@Override
public ITriggerProvider setIcon(ItemStack stack) {
this.stack = stack;
return this;
}
@Override
public ITriggerProvider setCancelable() {
this.isCancelable = true;
return this;
}
@Override
public boolean isVisible() {
return isVisible;
}
@Override
public void readFromJSON(JsonObject data) {
isVisible = JSONHelper.getBoolean(data, "isVisible", true);
isCanceling = JSONHelper.getBoolean(data, "isCanceling", false);
}
@Override
public void writeToJSON(JsonObject data) {
JSONHelper.setBoolean(data, "isVisible", isVisible, true);
JSONHelper.setBoolean(data, "isCanceling", isCanceling, false);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || !(o instanceof ITriggerProvider)) return false;
ITriggerProvider that = (ITriggerProvider) o;
return getUniqueID() != null ? getUniqueID().equals(that.getUniqueID()) : that.getUniqueID() == null;
}
@Override
public int hashCode() {
return getUniqueID() != null ? getUniqueID().hashCode() : 0;
}
}