package tonius.neiintegration.mods.forestry36;

import java.awt.Point;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.List;

import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.fluids.FluidContainerRegistry.FluidContainerData;
import net.minecraftforge.fluids.FluidStack;
import tonius.neiintegration.PositionedFluidTank;
import tonius.neiintegration.RecipeHandlerBase;
import tonius.neiintegration.Utils;
import codechicken.lib.gui.GuiDraw;
import codechicken.nei.PositionedStack;
import forestry.factory.gadgets.MachineBottler;

public class RecipeHandlerBottler extends RecipeHandlerBase {
    
    private static Class<? extends GuiContainer> guiClass;
    private static List<MachineBottler.Recipe> recipes = new ArrayList<MachineBottler.Recipe>();
    
    @Override
    public void prepare() {
        guiClass = Utils.getClass("forestry.factory.gui.GuiBottler");
        for (FluidContainerData container : FluidContainerRegistry.getRegisteredFluidContainerData()) {
            MachineBottler.Recipe recipe = MachineBottler.RecipeManager.findMatchingRecipe(container.fluid, container.emptyContainer);
            if (recipe != null) {
                recipes.add(recipe);
            }
        }
    }
    
    public class CachedBottlerRecipe extends CachedBaseRecipe {
        
        public PositionedFluidTank fluid;
        public PositionedStack input;
        public PositionedStack output;
        
        public CachedBottlerRecipe(MachineBottler.Recipe recipe) {
            if (recipe.input != null) {
                this.fluid = new PositionedFluidTank(recipe.input, 10000, new Rectangle(48, 6, 16, 58), RecipeHandlerBottler.this.getGuiTexture(), new Point(176, 0));
            }
            if (recipe.can != null) {
                this.input = new PositionedStack(recipe.can, 111, 8);
            }
            if (recipe.bottled != null) {
                this.output = new PositionedStack(recipe.bottled, 111, 44);
            }
        }
        
        @Override
        public PositionedStack getIngredient() {
            return this.input;
        }
        
        @Override
        public PositionedStack getResult() {
            return this.output;
        }
        
        @Override
        public PositionedFluidTank getFluidTank() {
            return this.fluid;
        }
        
    }
    
    @Override
    public String getRecipeID() {
        return "forestry.bottler";
    }
    
    @Override
    public String getRecipeName() {
        return Utils.translate("tile.for.factory.0.name", false);
    }
    
    @Override
    public String getGuiTexture() {
        return "forestry:textures/gui/bottler.png";
    }
    
    @Override
    public void loadTransferRects() {
        this.addTransferRect(75, 27, 24, 17);
    }
    
    @Override
    public Class<? extends GuiContainer> getGuiClass() {
        return guiClass;
    }
    
    @Override
    public void drawBackground(int recipe) {
        this.changeToGuiTexture();
        GuiDraw.drawTexturedModalRect(43, 0, 48, 11, 123, 65);
    }
    
    @Override
    public void drawExtras(int recipe) {
        this.drawProgressBar(75, 27, 176, 74, 24, 17, 40, 0);
    }
    
    @Override
    public void loadAllRecipes() {
        for (MachineBottler.Recipe recipe : recipes) {
            this.arecipes.add(new CachedBottlerRecipe(recipe));
        }
    }
    
    @Override
    public void loadCraftingRecipes(ItemStack result) {
        for (MachineBottler.Recipe recipe : recipes) {
            if (Utils.areStacksSameTypeCraftingSafe(recipe.bottled, result)) {
                this.arecipes.add(new CachedBottlerRecipe(recipe));
            }
        }
    }
    
    @Override
    public void loadUsageRecipes(ItemStack ingred) {
        super.loadUsageRecipes(ingred);
        for (MachineBottler.Recipe recipe : recipes) {
            if (Utils.areStacksSameTypeCraftingSafe(recipe.can, ingred)) {
                this.arecipes.add(new CachedBottlerRecipe(recipe));
            }
        }
    }
    
    @Override
    public void loadUsageRecipes(FluidStack ingred) {
        for (MachineBottler.Recipe recipe : recipes) {
            if (Utils.areFluidsSameType(recipe.input, ingred)) {
                this.arecipes.add(new CachedBottlerRecipe(recipe));
            }
        }
    }
    
}