package gtPlusPlus.xmod.gregtech.loaders;

import net.minecraft.item.ItemStack;

import gregtech.api.enums.GT_Values;
import gregtech.api.enums.ItemList;
import gregtech.api.enums.Materials;
import gregtech.api.enums.OrePrefixes;
import gregtech.api.enums.SubTag;
import gregtech.api.util.GT_OreDictUnificator;
import gregtech.common.items.GT_MetaGenerated_Tool_01;
import gtPlusPlus.api.objects.Logger;
import gtPlusPlus.core.recipe.common.CI;
import gtPlusPlus.core.util.minecraft.MaterialUtils;
import gtPlusPlus.core.util.minecraft.RecipeUtils;
import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes;
import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
import gtPlusPlus.xmod.gregtech.api.interfaces.internal.Interface_OreRecipeRegistrator;
import gtPlusPlus.xmod.gregtech.common.items.MetaGeneratedGregtechTools;

public class ProcessingElectricButcherKnife implements Interface_OreRecipeRegistrator, Runnable {

    public ProcessingElectricButcherKnife() {
        GregtechOrePrefixes.toolElectricButcherKnife.add(this);
    }

    @Override
    public void registerOre(final GregtechOrePrefixes aPrefix, final Materials aMaterial, final String aOreDictName,
            final String aModName, final ItemStack aStack) {
        if ((aMaterial != Materials.Stone) && (aMaterial != Materials.Flint)) {
            if (aMaterial != Materials.Rubber) {
                if ((!aMaterial.contains(SubTag.WOOD)) && (!aMaterial.contains(SubTag.BOUNCY))
                        && (!aMaterial.contains(SubTag.NO_SMASHING))) {}
            }
        }
    }

    @Override
    public void registerOre(final GregtechOrePrefixes aPrefix, final GT_Materials aMaterial, final String aOreDictName,
            final String aModName, final ItemStack aStack) {
        // TODO Auto-generated method stub

    }

    public void materialsLoops() {
        final Materials[] i = Materials.values();
        final int size = i.length;
        Logger.MATERIALS("Materials to attempt tool gen. with: " + size);
        int used = 0;
        Materials aMaterial = null;
        for (int r = 0; r < size; r++) {
            aMaterial = i[r];
            if ((aMaterial != Materials.Stone) && (aMaterial != Materials.Flint)
                    && (aMaterial != Materials.Rubber)
                    && (aMaterial != Materials._NULL)) {
                if ((!aMaterial.contains(SubTag.WOOD)) && (!aMaterial.contains(SubTag.BOUNCY))
                        && (!aMaterial.contains(SubTag.NO_SMASHING))
                        && (!aMaterial.contains(SubTag.TRANSPARENT))
                        && (!aMaterial.contains(SubTag.FLAMMABLE))
                        && (!aMaterial.contains(SubTag.MAGICAL))
                        && (!aMaterial.contains(SubTag.NO_SMELTING))) {
                    Logger.MATERIALS(
                            "Generating Electric Butcher Knife from " + MaterialUtils.getMaterialName(aMaterial));
                    // Input 1

                    final ItemStack plate = GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L);
                    final ItemStack screw = GT_OreDictUnificator.get(OrePrefixes.screw, aMaterial, 1L);

                    if ((null != plate) && screw != null) {
                        addRecipe(aMaterial, 1600000L, 3, ItemList.Battery_RE_HV_Lithium.get(1));
                        addRecipe(aMaterial, 1200000L, 3, ItemList.Battery_RE_HV_Cadmium.get(1));
                        addRecipe(aMaterial, 800000L, 3, ItemList.Battery_RE_HV_Sodium.get(1));
                        used++;
                    } else {
                        Logger.MATERIALS(
                                "Unable to generate Electric Butcher Knife from "
                                        + MaterialUtils.getMaterialName(aMaterial)
                                        + ", Plate or Long Rod may be invalid. Invalid | Plate? "
                                        + (plate == null)
                                        + " | Rod? "
                                        + " |");
                    }
                    // GT_ModHandler.addCraftingRecipe(,
                    // GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS |
                    // GT_ModHandler.RecipeBits.BUFFERED, new Object[]{"P H", "PIP", " I ",
                    // Character.valueOf('I'), OrePrefixes.ingot.get(aMaterial),
                    // Character.valueOf('P'), OrePrefixes.plate.get(aMaterial),
                    // Character.valueOf('H'), OrePrefixes.toolHeadHammer.get(aMaterial)});
                } else {
                    Logger.MATERIALS(
                            "Unable to generate Electric Butcher Knife from "
                                    + MaterialUtils.getMaterialName(aMaterial));
                }
            } else {
                Logger.MATERIALS(
                        "Unable to generate Electric Butcher Knife from " + MaterialUtils.getMaterialName(aMaterial));
            }
        }

        Logger.INFO("Materials used for tool gen: " + used);
    }

    @Override
    public void run() {
        Logger.INFO("Generating Electric Butcher Knives for all valid GT Materials.");
        this.materialsLoops();
    }

    public boolean addRecipe(Materials aMaterial, long aBatteryStorage, int aVoltageTier, ItemStack aBattery) {

        ItemStack aOutputStack = MetaGeneratedGregtechTools.INSTANCE.getToolWithStats(
                MetaGeneratedGregtechTools.ELECTRIC_BUTCHER_KNIFE,
                1,
                aMaterial,
                Materials.Titanium,
                new long[] { aBatteryStorage, GT_Values.V[aVoltageTier], 3L, -1L });

        ItemStack aInputCutter = GT_MetaGenerated_Tool_01.INSTANCE
                .getToolWithStats(GT_MetaGenerated_Tool_01.BUTCHERYKNIFE, 1, aMaterial, aMaterial, null);

        long aDura = MetaGeneratedGregtechTools.getToolMaxDamage(aOutputStack);
        if (aDura <= 32000) {
            Logger.MATERIALS(
                    "Unable to generate Electric Butcher Knife from " + MaterialUtils.getMaterialName(aMaterial)
                            + ", Durability: "
                            + aDura);
            return false;
        }

        return RecipeUtils.addShapedRecipe(
                OrePrefixes.wireFine.get(Materials.Electrum),
                aInputCutter,
                OrePrefixes.wireFine.get(Materials.Electrum),
                OrePrefixes.plate.get(aMaterial),
                CI.getElectricMotor(aVoltageTier, 1),
                OrePrefixes.plate.get(aMaterial),
                OrePrefixes.screw.get(aMaterial),
                aBattery,
                OrePrefixes.screw.get(aMaterial),
                aOutputStack);
    }
}