package gtPlusPlus.xmod.railcraft;

import static gregtech.api.enums.Mods.GTPlusPlus;
import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
import static gregtech.api.enums.Mods.Railcraft;
import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
import static gregtech.api.util.GT_RecipeBuilder.TICKS;
import static gregtech.api.util.GT_RecipeConstants.UniversalChemical;
import static gtPlusPlus.core.creative.AddToCreativeTab.tabMisc;

import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;

import gregtech.api.enums.GT_Values;
import gregtech.api.enums.Materials;
import gregtech.api.enums.OrePrefixes;
import gregtech.api.util.GT_OreDictUnificator;
import gregtech.api.util.GT_Utility;
import gtPlusPlus.core.item.ModItems;
import gtPlusPlus.core.item.base.BaseItemBurnable;
import gtPlusPlus.core.lib.CORE;
import gtPlusPlus.core.recipe.common.CI;
import gtPlusPlus.core.util.minecraft.FluidUtils;
import gtPlusPlus.core.util.minecraft.ItemUtils;
import gtPlusPlus.xmod.railcraft.utils.RailcraftUtils;

public class HANDLER_Railcraft {

    public static void preInit() {
        // Register Custom Coal Coke
        ModItems.itemCoalCoke = new BaseItemBurnable(
                "itemCoalCoke",
                "Coking Coal",
                tabMisc,
                64,
                0,
                "Used for metallurgy.",
                "fuelCoke",
                3200,
                0).setTextureName(GTPlusPlus.ID + ":burnables/itemCoalCoke");

        // Add in things that once existed in 1.5.2
        ModItems.itemCactusCharcoal = new BaseItemBurnable(
                "itemCactusCharcoal",
                "Cactus Charcoal",
                tabMisc,
                64,
                0,
                "Used for smelting.",
                "fuelCactusCharcoal",
                400,
                0).setTextureName(GTPlusPlus.ID + ":burnables/itemCactusCharcoal");
        ModItems.itemSugarCharcoal = new BaseItemBurnable(
                "itemSugarCharcoal",
                "Sugar Charcoal",
                tabMisc,
                64,
                0,
                "Used for smelting.",
                "fuelSugarCharcoal",
                400,
                0).setTextureName(GTPlusPlus.ID + ":burnables/itemSugarCharcoal");
        ModItems.itemCactusCoke = new BaseItemBurnable(
                "itemCactusCoke",
                "Cactus Coke",
                tabMisc,
                64,
                0,
                "Used for smelting.",
                "fuelCactusCoke",
                800,
                0).setTextureName(GTPlusPlus.ID + ":burnables/itemCactusCoke");
        ModItems.itemSugarCoke = new BaseItemBurnable(
                "itemSugarCoke",
                "Sugar Coke",
                tabMisc,
                64,
                0,
                "Used for smelting.",
                "fuelSugarCoke",
                800,
                0).setTextureName(GTPlusPlus.ID + ":burnables/itemSugarCoke");

        ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(ModItems.itemCactusCharcoal), "itemCharcoalCactus");
        ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(ModItems.itemCactusCoke), "itemCokeCactus");
        ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(ModItems.itemSugarCharcoal), "itemCharcoalSugar");
        ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(ModItems.itemSugarCoke), "itemCokeSugar");
    }

    public static void postInit() {
        generateCokeOvenRecipes();
    }

    private static void generateCokeOvenRecipes() {
        ItemStack[] aInputs1 = new ItemStack[] { ItemUtils.getSimpleStack(Blocks.cactus),
                ItemUtils.getSimpleStack(Items.reeds) };
        ItemStack[] aInputs2 = new ItemStack[] { ItemUtils.getSimpleStack(ModItems.itemCactusCharcoal),
                ItemUtils.getSimpleStack(ModItems.itemSugarCharcoal) };
        ItemStack[] aOutputs = new ItemStack[] { ItemUtils.getSimpleStack(ModItems.itemCactusCoke),
                ItemUtils.getSimpleStack(ModItems.itemSugarCoke) };
        for (int i = 0; i < aOutputs.length; i++) {
            // Recipes for the Charcoals and Cokes, outputting either Creosote or Charcoal Byproducts depending on the
            // fluid input
            CORE.RA.addCokeOvenRecipe(
                    aInputs1[i],
                    CI.getNumberedCircuit(3),
                    null,
                    FluidUtils.getFluidStack("creosote", 100),
                    aInputs2[i],
                    20,
                    16);
            CORE.RA.addCokeOvenRecipe(
                    aInputs1[i],
                    CI.getNumberedCircuit(4),
                    FluidUtils.getFluidStack("nitrogen", 100),
                    FluidUtils.getFluidStack("charcoal_byproducts", 200),
                    aInputs2[i],
                    10,
                    16);
            CORE.RA.addCokeOvenRecipe(
                    aInputs2[i],
                    CI.getNumberedCircuit(3),
                    null,
                    FluidUtils.getFluidStack("creosote", 200),
                    aOutputs[i],
                    40,
                    16);
            CORE.RA.addCokeOvenRecipe(
                    aInputs2[i],
                    CI.getNumberedCircuit(4),
                    FluidUtils.getFluidStack("nitrogen", 50),
                    FluidUtils.getFluidStack("charcoal_byproducts", 100),
                    aOutputs[i],
                    20,
                    16);

            // Generate Wood Tar and Wood Gas from these Cokes
            CORE.RA.addCokeOvenRecipe(
                    aOutputs[i],
                    CI.getNumberedCircuit(5),
                    FluidUtils.getFluidStack("steam", 100),
                    Materials.WoodTar.getFluid(200),
                    Materials.Ash.getDustSmall(1),
                    60,
                    240);
            CORE.RA.addCokeOvenRecipe(
                    aOutputs[i],
                    CI.getNumberedCircuit(6),
                    FluidUtils.getFluidStack("steam", 100),
                    Materials.WoodGas.getFluid(300),
                    Materials.Ash.getDustSmall(1),
                    60,
                    240);

            // Fluid Extracting the Charcoals for Wood Tar
            GT_Values.RA.stdBuilder().itemInputs(aInputs2[i])
                    .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 1L)).outputChances(1000)
                    .fluidOutputs(Materials.WoodTar.getFluid(50L)).duration(1 * SECONDS + 10 * TICKS).eut(16)
                    .addTo(fluidExtractionRecipes);

            // Processing the Charcoals with Oxygen to get CO and CO2
            // C + O = CO
            GT_Values.RA.stdBuilder().itemInputs(aInputs2[i], GT_Utility.getIntegratedCircuit(1))
                    .itemOutputs(Materials.Ash.getDustTiny(1)).fluidInputs(Materials.Oxygen.getGas(500))
                    .fluidOutputs(Materials.CarbonMonoxide.getGas(500)).duration(4 * SECONDS).eut(8)
                    .addTo(UniversalChemical);
            // C + 2O = CO2
            GT_Values.RA.stdBuilder().itemInputs(aInputs2[i], GT_Utility.getIntegratedCircuit(2))
                    .itemOutputs(Materials.Ash.getDustTiny(1)).fluidInputs(Materials.Oxygen.getGas(2000))
                    .fluidOutputs(Materials.CarbonDioxide.getGas(1000)).duration(2 * SECONDS).eut(8)
                    .addTo(UniversalChemical);
        }
        if (Railcraft.isModLoaded()) {
            for (int i = 0; i < aOutputs.length; i++) {
                RailcraftUtils.addCokeOvenRecipe(
                        aInputs1[i],
                        true,
                        true,
                        aInputs2[i],
                        FluidUtils.getFluidStack("creosote", 30),
                        500);
            }
            for (int i = 0; i < aOutputs.length; i++) {
                RailcraftUtils.addCokeOvenRecipe(
                        aInputs2[i],
                        true,
                        true,
                        aOutputs[i],
                        FluidUtils.getFluidStack("creosote", 30),
                        500);
            }

            if (NewHorizonsCoreMod.isModLoaded()) {
                for (int i = 0; i < aOutputs.length; i++) {
                    RailcraftUtils.addAdvancedCokeOvenRecipe(aInputs1[i], true, true, aInputs2[i], 20);
                }
                for (int i = 0; i < aOutputs.length; i++) {
                    RailcraftUtils.addAdvancedCokeOvenRecipe(aInputs2[i], true, true, aOutputs[i], 20);
                }
            }
        }
    }
}