package tonius.neiintegration.mods.railcraft;

import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;

import mods.railcraft.api.crafting.IRockCrusherRecipe;
import mods.railcraft.api.crafting.RailcraftCraftingManager;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.item.ItemStack;

import org.lwjgl.opengl.GL11;

import tonius.neiintegration.PositionedStackAdv;
import tonius.neiintegration.RecipeHandlerBase;
import tonius.neiintegration.Utils;
import codechicken.lib.gui.GuiDraw;
import codechicken.nei.PositionedStack;
import codechicken.nei.api.API;

public class RecipeHandlerRockCrusher extends RecipeHandlerBase {
    
    private static final int[][] RESULTS = { { 0, 0 }, { 1, 0 }, { 2, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 2 }, { 1, 2 }, { 2, 2 } };
    private static Class<? extends GuiContainer> guiClass;
    
    @Override
    public void prepare() {
        guiClass = Utils.getClass("mods.railcraft.client.gui.GuiRockCrusher");
        API.setGuiOffset(guiClass, -3, 11);
    }
    
    public class CachedRockCrusherRecipe extends CachedBaseRecipe {
        
        public PositionedStack input;
        public List<PositionedStack> outputs = new ArrayList<PositionedStack>();
        
        public CachedRockCrusherRecipe(IRockCrusherRecipe recipe) {
            if (recipe.getInput() != null) {
                this.input = new PositionedStack(recipe.getInput(), 12, 10);
            }
            if (recipe.getOutputs() != null) {
                this.setResults(recipe.getOutputs());
            }
        }
        
        private void setResults(List<Entry<ItemStack, Float>> outputs) {
            int i = 0;
            for (Entry<ItemStack, Float> output : outputs) {
                if (i >= RESULTS.length) {
                    return;
                }
                this.outputs.add(new PositionedStackAdv(output.getKey(), 102 + RESULTS[i][0] * 18, 10 + RESULTS[i][1] * 18).setChance(output.getValue()));
                i++;
            }
        }
        
        @Override
        public PositionedStack getIngredient() {
            this.randomRenderPermutation(this.input, RecipeHandlerRockCrusher.this.cycleticks / 20);
            return this.input;
        }
        
        @Override
        public List<PositionedStack> getOtherStacks() {
            return this.outputs;
        }
        
        @Override
        public PositionedStack getResult() {
            return null;
        }
        
    }
    
    @Override
    public String getRecipeName() {
        return Utils.translate("tile.railcraft.machine.alpha.rock.crusher.name", false);
    }
    
    @Override
    public String getRecipeID() {
        return "railcraft.rockcrusher";
    }
    
    @Override
    public String getGuiTexture() {
        return "railcraft:textures/gui/gui_crusher.png";
    }
    
    @Override
    public void loadTransferRects() {
        this.addTransferRect(68, 9, 29, 53);
    }
    
    @Override
    public Class<? extends GuiContainer> getGuiClass() {
        return guiClass;
    }
    
    @Override
    public void drawBackground(int recipe) {
        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
        GuiDraw.changeTexture(this.getGuiTexture());
        GuiDraw.drawTexturedModalRect(9, 0, 5, 11, 146, 65);
    }
    
    @Override
    public void drawExtras(int recipe) {
        this.drawProgressBar(68, 9, 176, 0, 29, 53, 48, 0);
    }
    
    @Override
    public void loadAllRecipes() {
        for (IRockCrusherRecipe recipe : RailcraftCraftingManager.rockCrusher.getRecipes()) {
            if (recipe == null) {
                continue;
            }
            this.arecipes.add(new CachedRockCrusherRecipe(recipe));
        }
    }
    
    @Override
    public void loadCraftingRecipes(ItemStack result) {
        for (IRockCrusherRecipe recipe : RailcraftCraftingManager.rockCrusher.getRecipes()) {
            if (recipe == null) {
                continue;
            }
            if (recipe.getOutputs() != null) {
                for (Entry<ItemStack, Float> output : recipe.getOutputs()) {
                    if (Utils.areStacksSameTypeCraftingSafe(output.getKey(), result)) {
                        this.arecipes.add(new CachedRockCrusherRecipe(recipe));
                        break;
                    }
                }
            }
        }
    }
    
    @Override
    public void loadUsageRecipes(ItemStack ingredient) {
        for (IRockCrusherRecipe recipe : RailcraftCraftingManager.rockCrusher.getRecipes()) {
            if (recipe == null) {
                continue;
            }
            if (Utils.areStacksSameTypeCraftingSafe(recipe.getInput(), ingredient)) {
                this.arecipes.add(new CachedRockCrusherRecipe(recipe));
            }
        }
    }
    
}