package joshie.harvest.quests.town.tasks;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import joshie.harvest.api.HFApi;
import joshie.harvest.api.animals.AnimalFoodType;
import joshie.harvest.api.calendar.Season;
import joshie.harvest.api.crops.Crop;
import joshie.harvest.api.npc.NPCEntity;
import joshie.harvest.api.quests.HFQuest;
import joshie.harvest.api.town.Town;
import joshie.harvest.cooking.HFCooking;
import joshie.harvest.cooking.item.ItemMeal;
import joshie.harvest.cooking.item.ItemMeal.Meal;
import joshie.harvest.core.helpers.InventoryHelper;
import joshie.harvest.core.helpers.TextHelper;
import joshie.harvest.crops.HFCrops;
import joshie.harvest.npcs.HFNPCs;
import joshie.harvest.quests.base.QuestDaily;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
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.Nullable;
import java.util.Collection;
import java.util.List;
import static joshie.harvest.api.calendar.Season.WINTER;
import static joshie.harvest.core.helpers.InventoryHelper.ORE_DICTIONARY;
@HFQuest("collect.crops")
public class QuestCollectCrops extends QuestDaily {
private static final Multimap<Season, Crop> CROPS = HashMultimap.create();
private Crop crop = HFCrops.TURNIP;
private int amount = 1;
public QuestCollectCrops() {
super(HFNPCs.CAFE_GRANNY);
}
@Override
public boolean canStartDailyQuest(Town town, World world, BlockPos pos) {
return super.canStartDailyQuest(town, world, pos) && HFApi.calendar.getDate(world).getSeason() != WINTER;
}
@Override
public String getDescription(World world, @Nullable EntityPlayer player) {
if (player != null) return getLocalized("desc", amount, crop.getLocalizedName(true));
else return getLocalized("task", amount, crop.getLocalizedName(true));
}
@Override
public void onSelectedAsDailyQuest(Town town, World world, BlockPos pos) {
rand.setSeed(HFApi.calendar.getDate(world).hashCode());
amount = 1 + rand.nextInt(10);
List<Crop> list = Lists.newArrayList(getCrops(HFApi.calendar.getDate(world).getSeason()));
crop = list.get(rand.nextInt(list.size()));
}
private Collection<Crop> getCrops(Season season) {
if (CROPS.get(season).size() > 0) return CROPS.get(season);
else {
Crop.REGISTRY.values().stream().filter(crop -> crop.getSeedCost() != 0 && crop.getFoodType() != AnimalFoodType.GRASS && crop != Crop.NULL_CROP
&& Lists.newArrayList(crop.getSeasons()).contains(season)).forEach(crop -> CROPS.get(season).add(crop));
return CROPS.get(season);
}
}
@Override
public boolean isNPCUsed(EntityPlayer player, NPCEntity entity) {
if (!super.isNPCUsed(player, entity)) return false;
String name = "crop" + WordUtils.capitalizeFully(crop.getResource().getResourcePath(), '_').replace("_", "");
return InventoryHelper.getHandItemIsIn(player, ORE_DICTIONARY, name, amount) != null;
}
@Override
@Nullable
@SideOnly(Side.CLIENT)
public String getLocalizedScript(EntityPlayer player, NPCEntity entity) {
return TextHelper.getRandomSpeech(entity.getNPC(), "harvestfestival.quest.collect.crops.complete", 32);
}
@Override
public void onChatClosed(EntityPlayer player, NPCEntity entity, boolean wasSneaking) {
String name = "crop" + WordUtils.capitalizeFully(crop.getResource().getResourcePath(), '_').replace("_", "");
if (InventoryHelper.takeItemsIfHeld(player, ORE_DICTIONARY, name, amount) != null) {
complete(player);
}
}
@Override
public void onQuestCompleted(EntityPlayer player) {
HFApi.player.getRelationsForPlayer(player).affectRelationship(HFNPCs.CAFE_GRANNY, 2500);
ItemStack stack = HFCooking.MEAL.getCreativeStack(ItemMeal.MEALS[player.worldObj.rand.nextInt(Meal.values().length)]);
stack.stackSize = 3;
if (player.worldObj.rand.nextInt(10) == 0) {
stack.stackSize = 10;
}
rewardItem(player, stack);
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
amount = nbt.getByte("TargetAmount");
crop = Crop.REGISTRY.get(new ResourceLocation(nbt.getString("TargetCrop")));
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound nbt) {
nbt.setByte("TargetAmount", (byte) amount);
if (crop != null) nbt.setString("TargetCrop", crop.getResource().toString());
return super.writeToNBT(nbt);
}
}