package joshie.harvest.quests.town.festivals.contest.cooking;
import joshie.harvest.api.HFApi;
import joshie.harvest.api.cooking.Recipe;
import joshie.harvest.api.cooking.Utensil;
import joshie.harvest.api.npc.NPC;
import joshie.harvest.core.helpers.EntityHelper;
import joshie.harvest.core.helpers.SpawnItemHelper;
import joshie.harvest.core.helpers.TextHelper;
import joshie.harvest.core.tile.TilePlate;
import joshie.harvest.npcs.entity.EntityNPC;
import joshie.harvest.quests.town.festivals.Place;
import joshie.harvest.quests.town.festivals.QuestContestCooking;
import joshie.harvest.quests.town.festivals.contest.ContestEntry;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemFood;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumHand;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import javax.annotation.Nullable;
import java.util.List;
import java.util.UUID;
@SuppressWarnings("WeakerAccess")
public class CookingContestEntry extends ContestEntry<QuestContestCooking> {
private final ItemStack stack;
private final BlockPos pos;
private final Utensil category;
public CookingContestEntry(UUID player, BlockPos pos, ItemStack stack, int stall) {
super(player, stall);
this.stack = stack;
this.pos = pos;
this.category = getUtensilFromStack(stack);
}
public CookingContestEntry(NPC npc, BlockPos pos, ItemStack stack, int stall) {
super(npc, stall);
this.stack = stack;
this.pos = pos;
this.category = getUtensilFromStack(stack);
}
private Utensil getUtensilFromStack(ItemStack stack) {
for (Recipe recipe: Recipe.REGISTRY.values()) {
if (recipe.getStack().isItemEqual(stack)) return recipe.getUtensil();
}
return null;
}
@Override
public int getScore(QuestContestCooking quest, World world) {
int hunger = ((ItemFood)stack.getItem()).getHealAmount(stack);
float saturation = ((ItemFood)stack.getItem()).getSaturationModifier(stack);
long gold = HFApi.shipping.getSellValue(stack);
return (int)(hunger * saturation + gold) - ((category == quest.getCategory()) ? 0: 1000);
}
@Override
public String getName(World world) {
return stack.getDisplayName();
}
@Override
public String getTextFromScore(String unlocalised, int score) {
return TextHelper.localize(unlocalised + "." + Math.max(0, Math.min(9, (int)Math.floor(((double)score) / 1000))));
}
public boolean isInvalid(World world) {
TileEntity tile = world.getTileEntity(pos);
if (tile instanceof TilePlate) {
ItemStack contents = ((TilePlate)tile).getContents();
return !contents.isItemEqual(stack);
} else return true;
}
@Override
public void reward(World world, Place place, NPC[] npcs, ItemStack reward) {
EntityPlayer player = getPlayer(world);
if (player != null) { //Give the rewards for this
SpawnItemHelper.addToPlayerInventory(player, reward);
for (NPC npc: npcs) {
HFApi.player.getRelationsForPlayer(player).affectRelationship(npc, place.happiness);
}
} else if (npc != null) {
List<EntityNPC> npcList = EntityHelper.getEntities(EntityNPC.class, world, pos, 64D, 64D);
for (EntityNPC aNPC: npcList) {
if (aNPC.getNPC() == npc) {
aNPC.setHeldItem(EnumHand.OFF_HAND, reward);
break;
}
}
}
}
@Override
public NBTTagCompound toNBT() {
NBTTagCompound tag = super.toNBT();
tag.setTag("Stack", stack.writeToNBT(new NBTTagCompound()));
tag.setLong("Pos", pos.toLong());
return tag;
}
@Nullable
public static CookingContestEntry fromNBT(NBTTagCompound tag) {
ItemStack stack = ItemStack.loadItemStackFromNBT(tag.getCompoundTag("Stack"));
BlockPos pos = BlockPos.fromLong(tag.getLong("Pos"));
Integer stall = tag.getInteger("Stall");
if (tag.hasKey("Player")) {
UUID player = UUID.fromString(tag.getString("Player"));
return new CookingContestEntry(player, pos, stack, stall);
} else if (tag.hasKey("NPC")) {
NPC npc = NPC.REGISTRY.get(new ResourceLocation(tag.getString("NPC")));
return new CookingContestEntry(npc, pos, stack, stall);
} else return null;
}
}