package joshie.harvest.shops.purchasable;
import joshie.harvest.api.HFApi;
import joshie.harvest.api.knowledge.Note;
import joshie.harvest.api.shops.IPurchasable;
import joshie.harvest.core.helpers.InventoryHelper;
import joshie.harvest.core.helpers.SpawnItemHelper;
import joshie.harvest.core.helpers.TextHelper;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import org.apache.commons.lang3.text.WordUtils;
import javax.annotation.Nonnull;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import static joshie.harvest.core.helpers.InventoryHelper.ITEM_STACK;
public class Purchasable implements IPurchasable {
protected String resource;
protected ItemStack stack;
protected long cost;
private String tooltip;
private int stock;
private Note note;
public Purchasable(){}
public Purchasable(long cost, ItemStack stack) {
this.cost = cost;
this.stack = stack;
this.resource = ((cost >= 0) ? "buy:" : "sell:") + stackToString(stack);
}
public Purchasable addTooltip(String tooltip) {
this.tooltip = "harvestfestival." + tooltip + ".tooltip";
return this;
}
public Purchasable setStock(int stock) {
this.stock = stock;
return this;
}
public Purchasable setNote(Note note) {
this.note = note;
return this;
}
private static String stackToString(ItemStack stack) {
if (stack == null) return "null";
String string = stack.getItem().getRegistryName().toString().replace(":", "_");
if (stack.getItemDamage() != 0) string = string + "_" + stack.getItemDamage();
if (stack.getTagCompound() != null) string = string + "_" + stack.getTagCompound().hashCode();
return string;
}
@Override
public boolean canDo(@Nonnull World world, @Nonnull EntityPlayer player, int amount) {
return getCost() >= 0 || InventoryHelper.hasInInventory(player, ITEM_STACK, getDisplayStack(), (getDisplayStack().stackSize * amount));
}
@Override
public long getCost() {
return cost;
}
@Override
public int getStock() {
return stock;
}
@Override
public ItemStack getDisplayStack() {
return stack;
}
protected ItemStack getPurchasedStack() {
return getDisplayStack();
}
@Override
public void onPurchased(EntityPlayer player) {
if (getCost() < 0) {
InventoryHelper.takeItemsInInventory(player, ITEM_STACK, getPurchasedStack(), getPurchasedStack().stackSize);
} else {
SpawnItemHelper.addToPlayerInventory(player, getPurchasedStack().copy());
}
if (note != null) HFApi.player.getTrackingForPlayer(player).learnNote(note);
}
@SideOnly(Side.CLIENT)
@Override
public void addTooltip(List<String> list) {
if (this.tooltip != null) {
list.add(TextFormatting.AQUA + getDisplayName());
list.add("---------------------------");
String tooltip = WordUtils.wrap(TextHelper.localize(this.tooltip.toLowerCase(Locale.ENGLISH)), 40);
list.addAll(Arrays.asList(tooltip.split("\r\n")));
} else list.add(TextFormatting.WHITE + getDisplayName());
}
@Override
public String getPurchaseableID() {
return resource;
}
}