package greymerk.roguelike.dungeon.settings;

import java.util.ArrayList;
import java.util.List;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.BiomeDictionary;

public class SpawnCriteria {

	int weight;
	List<ResourceLocation> biomes;
	List<BiomeDictionary.Type> biomeTypes;
	boolean everywhere;

	public SpawnCriteria(){
		this.weight = 1;
		this.biomes = new ArrayList<ResourceLocation>();
		this.biomeTypes = new ArrayList<BiomeDictionary.Type>();
		this.everywhere = false;
	}
	
	public SpawnCriteria(JsonObject data){
		this();
		
		this.weight = data.has("weight") ? data.get("weight").getAsInt() : 1;
		
		if(data.has("biomes")){
			JsonArray biomeList = data.get("biomes").getAsJsonArray();
			this.biomes = new ArrayList<ResourceLocation>();
			for(JsonElement e : biomeList){
				String name = e.getAsString();
				this.biomes.add(new ResourceLocation(name));
			}
		}
		
		if(data.has("biomeTypes")){
			JsonArray biomeTypeList = data.get("biomeTypes").getAsJsonArray();
			this.biomeTypes = new ArrayList<BiomeDictionary.Type>();
			for(JsonElement e : biomeTypeList){
				String type = e.getAsString().toUpperCase();
				BiomeDictionary.Type t = BiomeDictionary.Type.getType(type, new BiomeDictionary.Type[0]);
				if(BiomeDictionary.getBiomes(t).size() > 0) this.biomeTypes.add(t);
			}
		}
		
		this.everywhere = this.biomes.isEmpty() && this.biomeTypes.isEmpty();
	}
	
	public void setWeight(int weight){
		this.weight = weight;
	}
	
	public void setbiomes(List<ResourceLocation> biomes){
		this.biomes = biomes;
		this.everywhere = this.biomes.isEmpty() && this.biomeTypes.isEmpty();
	}
	
	public void setBiomeTypes(List<BiomeDictionary.Type> biomeTypes){
		this.biomeTypes = biomeTypes;
		this.everywhere = this.biomes.isEmpty() && this.biomeTypes.isEmpty();
	}
	
	
	public boolean isValid(ISpawnContext context){
		
		if(this.everywhere) return true;
		
		boolean biomeFound = false;
		
		if(this.biomes != null)	biomeFound = context.includesBiome(biomes);
		
		if(this.biomeTypes != null) biomeFound = context.includesBiomeType(this.biomeTypes);
		
		return biomeFound;
	}
	
	public static boolean isValidDimension(int dim, List<Integer> wl, List<Integer> bl){
		if(bl.contains(dim)) return false;
		if(wl.isEmpty()) return true;
		return wl.contains(dim);
	}
	
}