package joshie.harvest.quests.town.festivals.contest.cooking;
import com.google.common.collect.Lists;
import joshie.harvest.api.HFApi;
import joshie.harvest.api.npc.NPC;
import joshie.harvest.buildings.HFBuildings;
import joshie.harvest.cooking.HFCooking;
import joshie.harvest.core.helpers.EntityHelper;
import joshie.harvest.core.tile.TilePlate;
import joshie.harvest.quests.town.festivals.QuestContestCooking;
import joshie.harvest.quests.town.festivals.contest.ContestEntries;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import org.apache.commons.lang3.tuple.Pair;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
public class CookingContestEntries extends ContestEntries<ItemStack, CookingContestEntry, QuestContestCooking> {
public CookingContestEntries(BlockPos[] locations, NPC[] npcs) {
super(locations, npcs);
}
@Override
protected void createEntry(EntityPlayer player, World world, BlockPos pos, int stall) {
TileEntity tile = world.getTileEntity(pos);
ItemStack meal = HFCooking.MEAL.getRandomMeal(world.rand);
if (tile instanceof TilePlate) {
TilePlate plate = ((TilePlate)tile);
plate.setContents(meal.copy());
}
entries.add(new CookingContestEntry(getNextEntry(player, usedNPCS, npcs), pos, meal, stall));
}
@Override
public List<Pair<ItemStack, Integer>> getAvailableEntries(EntityPlayer player) {
//Validate the existing entries
validateExistingEntries(player.worldObj);
List<Pair<ItemStack, Integer>> list = Lists.newArrayList();
for (int i = 0; i < locations.length; i++) {
BlockPos location = locations[i];
int stall = i + 1;
if (!isEntered(stall)) {
BlockPos target = HFApi.towns.getTownForEntity(player).getCoordinatesFromOffset(HFBuildings.FESTIVAL_GROUNDS, location);
if (target != null) {
TileEntity tile = player.worldObj.getTileEntity(target);
if (tile instanceof TilePlate) {
ItemStack stack = ((TilePlate) tile).getContents();
if (stack != null) {
Pair<ItemStack, Integer> pair = Pair.of(stack, stall);
if (!list.contains(pair)) list.add(pair);
}
}
}
}
}
return list;
}
@Override
public List<Pair<String, Integer>> getAvailableEntryNames(EntityPlayer player) {
List<Pair<String, Integer>> list = new ArrayList<>();
for (Pair<ItemStack, Integer> pair: getAvailableEntries(player)) {
list.add(Pair.of(pair.getKey().getDisplayName(), pair.getValue()));
}
return list;
}
@Override
public void enter(EntityPlayer player, ItemStack stack, int stall) {
UUID playerUUID = EntityHelper.getPlayerUUID(player);
//Wipe out any entries that match the exist
Iterator<CookingContestEntry> it = entries.iterator();
while (it.hasNext()) {
CookingContestEntry entry = it.next();
if (entry.getStall() == stall || playerUUID.equals(entry.getPlayerUUID())) {
it.remove();
}
}
BlockPos target = HFApi.towns.getTownForEntity(player).getCoordinatesFromOffset(HFBuildings.FESTIVAL_GROUNDS, locations[stall]);
entries.add(new CookingContestEntry(playerUUID, target, stack, stall));
selecting.remove(playerUUID);
}
@Override
protected CookingContestEntry fromNBT(NBTTagCompound tag) {
return CookingContestEntry.fromNBT(tag);
}
}