package kekztech.common.recipeLoaders;

import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
import static gregtech.api.util.GTRecipeBuilder.MINUTES;
import static gregtech.api.util.GTRecipeBuilder.SECONDS;

import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidRegistry;

import gregtech.api.enums.GTValues;
import gregtech.api.enums.ItemList;
import gregtech.api.enums.Materials;
import gregtech.api.enums.MaterialsUEVplus;
import gregtech.api.enums.OrePrefixes;
import gregtech.api.enums.TierEU;
import gregtech.api.util.GTModHandler;
import gregtech.api.util.GTOreDictUnificator;
import gregtech.api.util.GTUtility;
import kekztech.Items;
import kekztech.common.Blocks;
import kekztech.common.TileEntities;
import kekztech.common.items.ErrorItem;
import kekztech.common.items.MetaItemCraftingComponent;

public class Assembler implements Runnable {

    @Override
    public void run() {
        // TFFT Casing

        GTValues.RA.stdBuilder()
            .itemInputs(
                GTUtility.getIntegratedCircuit(6),
                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.StainlessSteel, 1),
                GTOreDictUnificator.get(OrePrefixes.plate, Materials.DarkSteel, 3),
                GTOreDictUnificator.get(OrePrefixes.plate, Materials.EnderPearl, 3))
            .itemOutputs(new ItemStack(Blocks.tfftStorageField, 1))
            .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(144))
            .duration(5 * SECONDS)
            .eut(TierEU.RECIPE_HV)
            .addTo(assemblerRecipes);
        // TFFT Multi Hatch

        GTValues.RA.stdBuilder()
            .itemInputs(
                ItemList.Hull_HV.get(1),
                ItemList.Cover_FluidStorageMonitor.get(1),
                ItemList.Field_Generator_LV.get(4),
                GTOreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Polytetrafluoroethylene, 25))
            .itemOutputs(TileEntities.tfftHatch.getStackForm(1))
            .fluidInputs(Materials.Plastic.getMolten(432))
            .duration(20 * SECONDS)
            .eut(TierEU.RECIPE_HV)
            .addTo(assemblerRecipes);
        // TFFTStorageField1

        GTValues.RA.stdBuilder()
            .itemInputs(
                GTUtility.getIntegratedCircuit(6),
                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.CrudeSteel, 1),
                GTOreDictUnificator.get(OrePrefixes.plate, Materials.CrudeSteel, 6),
                GTOreDictUnificator.get(OrePrefixes.pipeNonuple, Materials.Steel, 3),
                ItemList.FluidRegulator_LV.get(1))
            .itemOutputs(new ItemStack(Blocks.tfftStorageField, 1, 1))
            .fluidInputs(Materials.Glass.getMolten(144))
            .duration(5 * SECONDS)
            .eut(TierEU.RECIPE_HV)
            .addTo(assemblerRecipes);
        // TFFTStorageField2

        GTValues.RA.stdBuilder()
            .itemInputs(
                GTUtility.getIntegratedCircuit(6),
                ItemList.Casing_Tank_1.get(1),
                GTOreDictUnificator.get(OrePrefixes.plate, Materials.EnergeticSilver, 6),
                GTOreDictUnificator.get(OrePrefixes.pipeNonuple, Materials.Plastic, 3),
                ItemList.FluidRegulator_MV.get(1))
            .itemOutputs(new ItemStack(Blocks.tfftStorageField, 1, 2))
            .fluidInputs(Materials.Plastic.getMolten(288))
            .duration(10 * SECONDS)
            .eut(TierEU.RECIPE_HV)
            .addTo(assemblerRecipes);
        // TFFTStorageField3

        GTValues.RA.stdBuilder()
            .itemInputs(
                GTUtility.getIntegratedCircuit(6),
                ItemList.Casing_Tank_3.get(1),
                GTOreDictUnificator.get(OrePrefixes.plate, Materials.VividAlloy, 6),
                GTOreDictUnificator.get(OrePrefixes.pipeNonuple, Materials.StainlessSteel, 3),
                ItemList.Field_Generator_LV.get(1),
                ItemList.FluidRegulator_HV.get(1))
            .itemOutputs(new ItemStack(Blocks.tfftStorageField, 1, 3))
            .fluidInputs(Materials.Plastic.getMolten(432))
            .duration(20 * SECONDS)
            .eut(TierEU.RECIPE_HV)
            .addTo(assemblerRecipes);
        // TFFTStorageField4

        GTValues.RA.stdBuilder()
            .itemInputs(
                GTUtility.getIntegratedCircuit(6),
                ItemList.Casing_Tank_5.get(1),
                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Enderium, 6),
                GTOreDictUnificator.get(OrePrefixes.pipeNonuple, Materials.Polytetrafluoroethylene, 3),
                ItemList.Field_Generator_MV.get(2),
                ItemList.FluidRegulator_EV.get(1))
            .itemOutputs(new ItemStack(Blocks.tfftStorageField, 1, 4))
            .fluidInputs(Materials.Epoxid.getMolten(864))
            .duration(20 * SECONDS)
            .eut(TierEU.RECIPE_EV)
            .addTo(assemblerRecipes);
        // TFFTStorageField5

        GTValues.RA.stdBuilder()
            .itemInputs(
                GTUtility.getIntegratedCircuit(6),
                ItemList.Casing_Tank_7.get(1),
                GTOreDictUnificator.get(OrePrefixes.plate, Materials.CrystallineAlloy, 6),
                GTOreDictUnificator.get(OrePrefixes.pipeNonuple, Materials.Enderium, 3),
                ItemList.Field_Generator_HV.get(4),
                ItemList.FluidRegulator_IV.get(1))
            .itemOutputs(new ItemStack(Blocks.tfftStorageField, 1, 5))
            .fluidInputs(Materials.Epoxid.getMolten(1152))
            .duration(20 * SECONDS)
            .eut(TierEU.RECIPE_IV)
            .addTo(assemblerRecipes);
        // LSC Casing

        GTValues.RA.stdBuilder()
            .itemInputs(
                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Tantalum, 4),
                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.TungstenSteel, 2),
                GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.TungstenSteel, 2),
                GTOreDictUnificator.get(OrePrefixes.block, Materials.Lapis, 1))
            .itemOutputs(new ItemStack(Blocks.lscLapotronicEnergyUnit, 1, 0))
            .duration(5 * SECONDS)
            .eut(TierEU.RECIPE_HV)
            .addTo(assemblerRecipes);
        // EV Capacitor alt recipe

        GTValues.RA.stdBuilder()
            .itemInputs(
                new ItemStack(Blocks.lscLapotronicEnergyUnit, 1, 6),
                GTModHandler.getIC2Item("lapotronCrystal", 1L, GTValues.W),
                GTUtility.getIntegratedCircuit(7))
            .itemOutputs(new ItemStack(Blocks.lscLapotronicEnergyUnit, 1, 7))
            .duration(10 * SECONDS)
            .eut(TierEU.RECIPE_HV)
            .addTo(assemblerRecipes);
        // IV Capacitor alt recipe

        GTValues.RA.stdBuilder()
            .itemInputs(
                new ItemStack(Blocks.lscLapotronicEnergyUnit, 1, 6),
                ItemList.Energy_LapotronicOrb.get(1L),
                GTUtility.getIntegratedCircuit(1))
            .itemOutputs(new ItemStack(Blocks.lscLapotronicEnergyUnit, 1, 1))
            .duration(20 * SECONDS)
            .eut(TierEU.RECIPE_EV)
            .addTo(assemblerRecipes);
        // LuV Capacitor alt recipe

        GTValues.RA.stdBuilder()
            .itemInputs(
                ItemList.Energy_LapotronicOrb2.get(1),
                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Osmiridium, 4),
                GTOreDictUnificator.get(OrePrefixes.screw, Materials.Osmiridium, 24),
                GTUtility.getIntegratedCircuit(6))
            .itemOutputs(new ItemStack(Blocks.lscLapotronicEnergyUnit, 1, 2))
            .duration(40 * SECONDS)
            .eut(TierEU.RECIPE_IV)
            .addTo(assemblerRecipes);
        // ZPM Capacitor alt recipe

        GTValues.RA.stdBuilder()
            .itemInputs(
                ItemList.Energy_Module.get(1),
                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.NaquadahAlloy, 4),
                GTOreDictUnificator.get(OrePrefixes.screw, Materials.NaquadahAlloy, 24),
                GTUtility.getIntegratedCircuit(6))
            .itemOutputs(new ItemStack(Blocks.lscLapotronicEnergyUnit, 1, 3))
            .duration(1 * MINUTES + 20 * SECONDS)
            .eut(TierEU.RECIPE_LuV)
            .addTo(assemblerRecipes);
        // UV Capacitor alt recipe

        GTValues.RA.stdBuilder()
            .itemInputs(
                ItemList.Energy_Cluster.get(1),
                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 4),
                GTOreDictUnificator.get(OrePrefixes.screw, Materials.Neutronium, 24),
                GTUtility.getIntegratedCircuit(6))
            .itemOutputs(new ItemStack(Blocks.lscLapotronicEnergyUnit, 1, 4))
            .duration(2 * MINUTES + 40 * SECONDS)
            .eut(TierEU.RECIPE_ZPM)
            .addTo(assemblerRecipes);
        // UHV Capacitor alt recipe

        GTValues.RA.stdBuilder()
            .itemInputs(
                ItemList.ZPM3.get(1),
                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.CosmicNeutronium, 4),
                GTOreDictUnificator.get(OrePrefixes.screw, Materials.CosmicNeutronium, 24),
                GTUtility.getIntegratedCircuit(6))
            .itemOutputs(new ItemStack(Blocks.lscLapotronicEnergyUnit, 1, 5))
            .duration(5 * MINUTES + 20 * SECONDS)
            .eut(TierEU.RECIPE_UV)
            .addTo(assemblerRecipes);
        // UEV Capacitor alt recipe

        GTValues.RA.stdBuilder()
            .itemInputs(
                ItemList.ZPM4.get(1),
                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Infinity, 4),
                GTOreDictUnificator.get(OrePrefixes.screw, Materials.Infinity, 24),
                GTUtility.getIntegratedCircuit(6))
            .itemOutputs(new ItemStack(Blocks.lscLapotronicEnergyUnit, 1, 8))
            .duration(10 * MINUTES + 40 * SECONDS)
            .eut(TierEU.RECIPE_UHV)
            .addTo(assemblerRecipes);
        // UIV Capacitor alt recipe

        GTValues.RA.stdBuilder()
            .itemInputs(
                ItemList.ZPM5.get(1),
                GTOreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.TranscendentMetal, 4),
                GTOreDictUnificator.get(OrePrefixes.screw, MaterialsUEVplus.TranscendentMetal, 24),
                GTUtility.getIntegratedCircuit(6))
            .itemOutputs(new ItemStack(Blocks.lscLapotronicEnergyUnit, 1, 9))
            .duration(10 * MINUTES + 40 * SECONDS)
            .eut(TierEU.RECIPE_UEV)
            .addTo(assemblerRecipes);
        // UMV Capacitor alt recipe

        GTValues.RA.stdBuilder()
            .itemInputs(
                ItemList.ZPM6.get(1),
                GTOreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.SpaceTime, 4),
                GTOreDictUnificator.get(OrePrefixes.screw, MaterialsUEVplus.SpaceTime, 24),
                GTUtility.getIntegratedCircuit(6))
            .itemOutputs(new ItemStack(Blocks.lscLapotronicEnergyUnit, 1, 10))
            .duration(10 * MINUTES + 40 * SECONDS)
            .eut(TierEU.RECIPE_UIV)
            .addTo(assemblerRecipes);

        final MetaItemCraftingComponent craftingItem = MetaItemCraftingComponent.getInstance();

        // YSZ Unit

        GTValues.RA.stdBuilder()
            .itemInputs(
                GTUtility.getIntegratedCircuit(6),
                craftingItem.getStackOfAmountFromDamage(Items.YSZCeramicPlate.getMetaID(), 4),
                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Yttrium, 1),
                GTOreDictUnificator.get(OrePrefixes.rotor, Materials.StainlessSteel, 1),
                ItemList.Electric_Motor_HV.get(1L))
            .itemOutputs(new ItemStack(Blocks.yszUnit, 1))
            .fluidInputs(Materials.Hydrogen.getGas(4000))
            .duration(60 * SECONDS)
            .eut(TierEU.RECIPE_HV)
            .addTo(assemblerRecipes);
        // GDC Unit

        GTValues.RA.stdBuilder()
            .itemInputs(
                GTUtility.getIntegratedCircuit(6),
                craftingItem.getStackOfAmountFromDamage(Items.GDCCeramicPlate.getMetaID(), 8),
                GTOreDictUnificator
                    .get(OrePrefixes.frameGt, Materials.Gadolinium, new ItemStack(ErrorItem.getInstance(), 1), 1),
                GTOreDictUnificator
                    .get(OrePrefixes.rotor, Materials.Desh, new ItemStack(ErrorItem.getInstance(), 1), 1),
                ItemList.Electric_Motor_IV.get(1L))
            .itemOutputs(new ItemStack(Blocks.gdcUnit, 1))
            .fluidInputs(Materials.Hydrogen.getGas(16000))
            .duration(2 * MINUTES)
            .eut(TierEU.RECIPE_EV)
            .addTo(assemblerRecipes);
        // Hex Tiles

        GTValues.RA.stdBuilder()
            .itemInputs(
                GTUtility.getIntegratedCircuit(6),
                GTOreDictUnificator.get(OrePrefixes.stone, Materials.Concrete, 1),
                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Steel, 1),
                GTOreDictUnificator.get(OrePrefixes.foil, Materials.DarkSteel, 2))
            .itemOutputs(new ItemStack(Blocks.largeHexPlate, 2))
            .fluidInputs(FluidRegistry.getFluidStack("molten.plastic", 36))
            .duration(30 * SECONDS)
            .eut(TierEU.RECIPE_MV)
            .addTo(assemblerRecipes);

    }
}