package joshie.harvest.town.tracker;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import joshie.harvest.core.util.HFTracker;
import joshie.harvest.npcs.HFNPCs;
import joshie.harvest.town.data.TownData;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.Rotation;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.common.DimensionManager;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.UUID;
public abstract class TownTracker<T extends TownData> extends HFTracker {
final HashMap<UUID, T> uuidMap = new HashMap<>();
BiMap<UUID, Integer> townIDs = HashBiMap.create();
public abstract T getNullTown();
@Nonnull
private T getClosestTown(@Nonnull final BlockPos pos) {
T closest = null;
double thatTownDistance = Double.MAX_VALUE;
for (T town: uuidMap.values()) {
double thisTownDistance = town.getTownCentre().getDistance(pos.getX(), pos.getY(), pos.getZ());
if (closest == null || thisTownDistance < thatTownDistance) {
thatTownDistance = thisTownDistance;
closest = town;
}
}
return thatTownDistance > HFNPCs.TOWN_DISTANCE || closest == null ? getNullTown(): closest;
}
@Nonnull
public T getClosestTownToBlockPos(@Nonnull BlockPos pos, boolean create) {
T data = getClosestTown(pos);
if (data == getNullTown() && create) {
data = createNewTown(pos);
}
return data;
}
public abstract T createNewTown(BlockPos blockPos);
public T getTownFromMineID(int mineID) {
UUID uuid = townIDs.inverse().get(mineID);
return uuid != null ? getTownByID(uuid) : getNullTown();
}
public T getTownByID(UUID townID) {
T result = uuidMap.get(townID);
return result == null ? getNullTown() : result;
}
public BlockPos getCoordinatesForOverworldMine(@Nullable Entity entity, int mineID) {
return entity instanceof EntityPlayer ? ((EntityPlayer) entity).getBedLocation(0) : DimensionManager.getWorld(0).getSpawnPoint();
}
public int getMineIDFromCoordinates(BlockPos pos) {
return -1;
}
public Rotation getMineOrientation(int mineID) {
return Rotation.NONE;
}
}