package pneumaticCraft.common.recipes;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Random;
import net.minecraft.inventory.IInventory;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.ChunkPosition;
import net.minecraftforge.fluids.IFluidHandler;
import pneumaticCraft.common.config.AmadronOfferPeriodicConfig;
import pneumaticCraft.common.entity.living.EntityDrone;
import pneumaticCraft.common.inventory.ContainerAmadron;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class AmadronOfferManager{
private static AmadronOfferManager CLIENT_INSTANCE = new AmadronOfferManager();
private static AmadronOfferManager SERVER_INSTANCE = new AmadronOfferManager();
private final LinkedHashSet<AmadronOffer> staticOffers = new LinkedHashSet<AmadronOffer>();
private final List<AmadronOffer> periodicOffers = new ArrayList<AmadronOffer>();
private final LinkedHashSet<AmadronOffer> selectedPeriodicOffers = new LinkedHashSet<AmadronOffer>();
private final LinkedHashSet<AmadronOffer> allOffers = new LinkedHashSet<AmadronOffer>();
public static AmadronOfferManager getInstance(){
return FMLCommonHandler.instance().getSide() == Side.SERVER ? SERVER_INSTANCE : CLIENT_INSTANCE;
}
public Collection<AmadronOffer> getStaticOffers(){
return staticOffers;
}
public Collection<AmadronOffer> getPeriodicOffers(){
return periodicOffers;
}
public Collection<AmadronOffer> getAllOffers(){
return allOffers;
}
public boolean addStaticOffer(AmadronOffer offer){
allOffers.add(offer);
return staticOffers.add(offer);
}
public boolean removeStaticOffer(AmadronOffer offer){
allOffers.remove(offer);
return staticOffers.remove(offer);
}
public boolean addPeriodicOffer(AmadronOffer offer){
if(periodicOffers.contains(offer)) {
return false;
} else {
periodicOffers.add(offer);
return true;
}
}
public void removePeriodicOffer(AmadronOffer offer){
periodicOffers.remove(offer);
}
public boolean hasOffer(AmadronOffer offer){
return allOffers.contains(offer);
}
public void recompileOffers(){
allOffers.clear();
allOffers.addAll(staticOffers);
allOffers.addAll(selectedPeriodicOffers);
}
/**
* Called client-side to update the client about the available offers.
*/
@SideOnly(Side.CLIENT)
public void setOffers(Collection<AmadronOffer> newOffers){
allOffers.clear();
allOffers.addAll(newOffers);
}
/**
* Gets the offer that equals() a copy.
* @param offer
* @return
*/
public AmadronOffer get(AmadronOffer offer){
for(AmadronOffer o : allOffers) {
if(o.equals(offer)) return o;
}
return null;
}
public int countOffers(String playerId){
int count = 0;
for(AmadronOffer offer : allOffers) {
if(offer instanceof AmadronOfferCustom && ((AmadronOfferCustom)offer).getPlayerId().equals(playerId)) count++;
}
return count;
}
public void tryRestockCustomOffers(){
for(AmadronOffer offer : allOffers) {
if(offer instanceof AmadronOfferCustom) {
AmadronOfferCustom custom = (AmadronOfferCustom)offer;
TileEntity input = custom.getProvidingTileEntity();
TileEntity output = custom.getReturningTileEntity();
int possiblePickups = ContainerAmadron.capShoppingAmount(custom.invert(), 50, input instanceof IInventory ? (IInventory)input : null, output instanceof IInventory ? (IInventory)output : null, input instanceof IFluidHandler ? (IFluidHandler)input : null, output instanceof IFluidHandler ? (IFluidHandler)output : null, null);
if(possiblePickups > 0) {
ChunkPosition pos = new ChunkPosition(input.xCoord, input.yCoord, input.zCoord);
EntityDrone drone = ContainerAmadron.retrieveOrderItems(custom, possiblePickups, input.getWorldObj(), pos, input.getWorldObj(), pos);
if(drone != null) {
drone.setHandlingOffer(custom.copy(), possiblePickups, null, "Restock");
}
}
custom.invert();
custom.payout();
}
}
}
public void shufflePeriodicOffers(){
Random rand = new Random();
allOffers.removeAll(selectedPeriodicOffers);
selectedPeriodicOffers.clear();
int toBeSelected = Math.min(AmadronOfferPeriodicConfig.offersPer, periodicOffers.size());
while(selectedPeriodicOffers.size() < toBeSelected) {
selectedPeriodicOffers.add(periodicOffers.get(rand.nextInt(periodicOffers.size())));
}
allOffers.addAll(selectedPeriodicOffers);
}
}