package pers.gwyog.gtneioreplugin.plugin.gregtech6;

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

import codechicken.lib.gui.GuiDraw;
import codechicken.nei.PositionedStack;
import codechicken.nei.recipe.TemplateRecipeHandler.CachedRecipe;
import gregapi.block.prefixblock.PrefixBlock;
import gregapi.data.CS;
import net.minecraft.client.resources.I18n;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
import pers.gwyog.gtneioreplugin.util.GT6OreBedrockHelper;
import pers.gwyog.gtneioreplugin.util.GT6OreLayerHelper;
import pers.gwyog.gtneioreplugin.util.GT6OreSmallHelper;
import pers.gwyog.gtneioreplugin.util.GT6OreBedrockHelper.OreBedrockWrapper;

public class PluginGT6BedrockOreStat extends PluginGT6Base {
    
    public class CachedBedrockOreStatRecipe extends CachedRecipe {
        public String oreName;
        public PositionedStack positionedStackOreBedrock;
        public PositionedStack positionedStackOreSmallBedrock;
        public PositionedStack positionedStackOre;
        public PositionedStack positionedStackOreSmall;
            
        public CachedBedrockOreStatRecipe(String oreName, ItemStack stackOreBedrock, ItemStack stackOreSmallBedrock,
                List<ItemStack> stackListOre, List<ItemStack> stackListOreSmall) {
            this.oreName = oreName;
            positionedStackOreBedrock = new PositionedStack(stackOreBedrock, 2, 0);
            positionedStackOreSmallBedrock = new PositionedStack(stackOreSmallBedrock, 22, 0);
            positionedStackOre = new PositionedStack(stackListOre, 42, 0);
            positionedStackOreSmall = new PositionedStack(stackListOreSmall, 62, 0);
        }
        
        @Override
        public List<PositionedStack> getIngredients() {
            List<PositionedStack> ingredientsList = new ArrayList<PositionedStack>();
            positionedStackOre.setPermutationToRender((cycleticks / 20) % positionedStackOre.items.length);;
            positionedStackOreSmall.setPermutationToRender((cycleticks / 20) % positionedStackOreSmall.items.length);;
            ingredientsList.add(positionedStackOreBedrock);
            ingredientsList.add(positionedStackOreSmallBedrock);
            ingredientsList.add(positionedStackOre);
            ingredientsList.add(positionedStackOreSmall);
            return ingredientsList;
        }
        
        @Override
        public PositionedStack getResult() {
            return null;
        }
        
    }
    
    @Override
    public void loadCraftingRecipes(String outputId, Object... results) {
        if (outputId.equals(getOutputId()))
            for (OreBedrockWrapper worldGen: GT6OreBedrockHelper.mapOreBedrockWrapper.values())
                loadCraftingRecipes(new ItemStack(CS.BlocksGT.oreBedrock, 1, worldGen.meta));
        else
            super.loadCraftingRecipes(outputId, results);
    }
    
    @Override
    public void loadCraftingRecipes(ItemStack stack) {
        String unlocalizedName = stack.getUnlocalizedName();
        if (unlocalizedName.startsWith("oredict.oreBedrock") || unlocalizedName.startsWith("oredict.ore") || unlocalizedName.startsWith("oredict.oreSmall")) {
            short meta = (short)stack.getItemDamage();
            for (OreBedrockWrapper worldGen: GT6OreBedrockHelper.mapOreBedrockWrapper.values()) {
                if (meta==worldGen.meta) {
                    ItemStack stackOreBedrock = new ItemStack(CS.BlocksGT.oreBedrock, 1, meta);
                    ItemStack stackOreSmallBedrock = new ItemStack(CS.BlocksGT.oreSmallBedrock, 1, meta);
                    List<ItemStack> stackListOre = new ArrayList<ItemStack>();
                    List<ItemStack> stackListOreSmall = new ArrayList<ItemStack>();
                    for (PrefixBlock prefixBlock: GT6OreLayerHelper.setOreNormalBasicTypes) 
                        stackListOre.add(new ItemStack(prefixBlock, 1, meta));
                    for (PrefixBlock prefixBlock: GT6OreSmallHelper.setOreSmallBasicTypes) 
                        stackListOreSmall.add(new ItemStack(prefixBlock, 1, meta));
                    this.arecipes.add(new CachedBedrockOreStatRecipe(worldGen.veinName, stackOreBedrock, stackOreSmallBedrock, stackListOre, stackListOreSmall));
                }
            }
        }
        else
            super.loadCraftingRecipes(stack);
    }
    
    @Override
    public void drawExtras(int recipe) {
        CachedBedrockOreStatRecipe crecipe = (CachedBedrockOreStatRecipe) this.arecipes.get(recipe);
        OreBedrockWrapper oreLayer = GT6OreBedrockHelper.mapOreBedrockWrapper.get(crecipe.oreName);
        GuiDraw.drawString(I18n.format("gtnop.gui.nei.oreName") + ": " + getLocalizedOreBedrockName(oreLayer.meta), 2, 18, 0x404040, false);
        GuiDraw.drawString(I18n.format("gtnop.gui.nei.oreOthers") + ": " + getLocalizedSmallOreName(oreLayer.meta), 2, 31, 0x404040, false);
        GuiDraw.drawString(I18n.format("gtnop.gui.nei.oreOthers") + ": " + getLocalizedOreName(oreLayer.meta), 2, 44, 0x404040, false);
        GuiDraw.drawString(I18n.format("gtnop.gui.nei.oreOthers") + ": " + getLocalizedSmallOreName(oreLayer.meta), 2, 57, 0x404040, false);
        GuiDraw.drawString(I18n.format("gtnop.gui.nei.genHeight") + ": " + "0-6", 2, 70, 0x404040, false);
        GuiDraw.drawString(I18n.format("gtnop.nei.genPosition") + ": " + I18n.format("gtnop.nei.genPositionInfo"), 2,83, 0x404040, false);
        GuiDraw.drawString(I18n.format("gtnop.gui.nei.weightedChance") + ": " + "1/" + oreLayer.probability, 2, 96, 0x404040, false);
        GuiDraw.drawString(I18n.format("gtnop.gui.nei.worldNames") + ": " + getWorldNameTranslated(oreLayer.genOverworld, oreLayer.genNether, oreLayer.genEnd, false, false), 2, 109, 0x404040, false);
        GuiDraw.drawStringR(EnumChatFormatting.BOLD + I18n.format("gtnop.gui.nei.seeAll"), getGuiWidth()-3, 5, 0x404040, false);
    }
    
    @Override
    public String getOutputId() {
        return "GTOrePluginOreBedrock";
    }
    
    @Override
    public String getRecipeName() {
        return I18n.format("gtnop.gui.bedrockOreStat.name");
    }
    
}