package kekztech.common.recipeLoaders;

import static goodgenerator.loader.Loaders.huiCircuit;
import static gregtech.api.enums.Mods.EnderIO;
import static gregtech.api.enums.Mods.EternalSingularity;
import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
import static gregtech.api.enums.Mods.UniversalSingularities;
import static gregtech.api.util.GTRecipeBuilder.HOURS;
import static gregtech.api.util.GTRecipeBuilder.MINUTES;
import static gregtech.api.util.GTRecipeBuilder.SECONDS;
import static gregtech.api.util.GTRecipeConstants.AssemblyLine;
import static gregtech.api.util.GTRecipeConstants.RESEARCH_ITEM;
import static gregtech.api.util.GTRecipeConstants.RESEARCH_TIME;
import static gtPlusPlus.core.material.MaterialsElements.STANDALONE.HYPOGEN;

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

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 kekztech.common.Blocks;

public class AssemblyLine implements Runnable {

    @Override
    public void run() {
        final Fluid radoxPoly = FluidRegistry.getFluid("molten.radoxpoly") != null
            ? FluidRegistry.getFluid("molten.radoxpoly")
            : FluidRegistry.getFluid("molten.polybenzimidazole");

        final Fluid solderIndalloy = FluidRegistry.getFluid("molten.indalloy140") != null
            ? FluidRegistry.getFluid("molten.indalloy140")
            : FluidRegistry.getFluid("molten.solderingalloy");

        // TFFTStorageField6
        GTValues.RA.stdBuilder()
            .metadata(RESEARCH_ITEM, new ItemStack(Blocks.tfftStorageField, 1, 5))
            .metadata(RESEARCH_TIME, 1 * HOURS + 6 * MINUTES + 40 * SECONDS)
            .itemInputs(
                ItemList.Casing_Tank_7.get(4),
                GTOreDictUnificator.get(OrePrefixes.plateQuadruple, Materials.CrystallinePinkSlime, 6),
                GTOreDictUnificator.get(OrePrefixes.pipeNonuple, Materials.Naquadah, 3),
                GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.ChromeBars", 6),
                GTOreDictUnificator.get(OrePrefixes.rotor, Materials.Quantium, 6),
                ItemList.Field_Generator_EV.get(8),
                ItemList.FluidRegulator_LuV.get(1),
                GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EngineeringProcessorFluidEmeraldCore", 4))
            .fluidInputs(Materials.Enderium.getMolten(1440), Materials.Polybenzimidazole.getMolten(1584))
            .itemOutputs(new ItemStack(Blocks.tfftStorageField, 1, 6))
            .eut(TierEU.RECIPE_LuV)
            .duration(30 * SECONDS)
            .addTo(AssemblyLine);

        // TFFTStorageField7
        GTValues.RA.stdBuilder()
            .metadata(RESEARCH_ITEM, new ItemStack(Blocks.tfftStorageField, 1, 6))
            .metadata(RESEARCH_TIME, 1 * HOURS + 6 * MINUTES + 40 * SECONDS)
            .itemInputs(
                ItemList.Casing_Tank_10.get(16),
                GTOreDictUnificator.get(OrePrefixes.plateQuadruple, Materials.MelodicAlloy, 6),
                GTOreDictUnificator.get(OrePrefixes.pipeNonuple, Materials.NetherStar, 3),
                GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.OsmiumBars", 6),
                GTOreDictUnificator.get(OrePrefixes.rotor, Materials.MysteriousCrystal, 6),
                ItemList.Field_Generator_IV.get(16),
                ItemList.Field_Generator_LuV.get(4),
                ItemList.FluidRegulator_UV.get(1),
                GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EngineeringProcessorFluidEmeraldCore", 16))
            .fluidInputs(Materials.CrystallineAlloy.getMolten(2880), Materials.Polybenzimidazole.getMolten(2016))
            .itemOutputs(new ItemStack(Blocks.tfftStorageField, 1, 7))
            .duration(30 * SECONDS)
            .eut(TierEU.RECIPE_UV)
            .addTo(AssemblyLine);

        // TFFTStorageField8
        GTValues.RA.stdBuilder()
            .metadata(RESEARCH_ITEM, new ItemStack(Blocks.tfftStorageField, 1, 7))
            .metadata(RESEARCH_TIME, 2 * HOURS + 40 * MINUTES)
            .itemInputs(
                ItemList.Quantum_Tank_IV.get(1),
                ItemList.Machine_Multi_NeutroniumCompressor.get(1),
                GTOreDictUnificator.get(OrePrefixes.plateDense, Materials.StellarAlloy, 6),
                GTOreDictUnificator.get(OrePrefixes.plateDense, Materials.StellarAlloy, 6),
                GTOreDictUnificator.get(OrePrefixes.pipeNonuple, Materials.DraconiumAwakened, 3),
                GTModHandler.getModItem(NewHorizonsCoreMod.ID, "item.NeutroniumBars", 6),
                GTOreDictUnificator.get(OrePrefixes.rotor, Materials.InfinityCatalyst, 6),
                ItemList.Field_Generator_ZPM.get(16),
                ItemList.Field_Generator_UV.get(4),
                new ItemStack(huiCircuit, 4, 2),
                GTModHandler.getModItem(UniversalSingularities.ID, "universal.tinkersConstruct.singularity", 1, 4))
            .fluidInputs(Materials.CrystallinePinkSlime.getMolten(4320), new FluidStack(radoxPoly, 2880))
            .itemOutputs(new ItemStack(Blocks.tfftStorageField, 1, 8))
            .duration(30 * SECONDS)
            .eut(TierEU.RECIPE_UEV)
            .addTo(AssemblyLine);

        GTValues.RA.stdBuilder()
            .metadata(RESEARCH_ITEM, new ItemStack(Blocks.tfftStorageField, 1, 8))
            .metadata(RESEARCH_TIME, 2 * HOURS + 13 * MINUTES + 20 * SECONDS)
            .itemInputs(
                ItemList.Quantum_Tank_IV.get(4),
                ItemList.Machine_Multi_NeutroniumCompressor.get(2),
                GTOreDictUnificator.get(OrePrefixes.plateDense, MaterialsUEVplus.TranscendentMetal, 6),
                GTOreDictUnificator.get(OrePrefixes.plateDense, MaterialsUEVplus.ProtoHalkonite, 6),
                GTOreDictUnificator.get(OrePrefixes.pipeNonuple, Materials.Infinity, 3),
                ItemList.EnergisedTesseract.get(1),
                HYPOGEN.getRotor(6),
                ItemList.Field_Generator_UHV.get(16),
                ItemList.Field_Generator_UEV.get(4),
                new ItemStack(huiCircuit, 4, 3),
                GTModHandler.getModItem(UniversalSingularities.ID, "universal.tinkersConstruct.singularity", 1, 4))
            .fluidInputs(Materials.MelodicAlloy.getMolten(5760), new FluidStack(radoxPoly, 3456))
            .itemOutputs(new ItemStack(Blocks.tfftStorageField, 1, 9))
            .duration(30 * SECONDS)
            .eut(TierEU.RECIPE_UMV)
            .addTo(AssemblyLine);

        // TFFTStorageField10
        GTValues.RA.stdBuilder()
            .metadata(RESEARCH_ITEM, new ItemStack(Blocks.tfftStorageField, 1, 9))
            .metadata(RESEARCH_TIME, 2 * HOURS + 46 * MINUTES + 40 * SECONDS)
            .itemInputs(
                ItemList.Quantum_Tank_IV.get(16),
                ItemList.Machine_Multi_NeutroniumCompressor.get(4),
                GTOreDictUnificator.get(OrePrefixes.plateDense, MaterialsUEVplus.SpaceTime, 6),
                GTOreDictUnificator.get(OrePrefixes.plateDense, MaterialsUEVplus.SpaceTime, 6),
                GTOreDictUnificator.get(OrePrefixes.pipeNonuple, MaterialsUEVplus.SpaceTime, 3),
                ItemList.EnergisedTesseract.get(6),
                GTOreDictUnificator.get(OrePrefixes.rotor, MaterialsUEVplus.SpaceTime, 6),
                ItemList.Field_Generator_UEV.get(16),
                ItemList.Field_Generator_UIV.get(4),
                new ItemStack(huiCircuit, 4, 4),
                new ItemStack(huiCircuit, 4, 4),
                GTModHandler.getModItem(EnderIO.ID, "itemBasicCapacitor", 64, 6),
                GTModHandler.getModItem(EternalSingularity.ID, "eternal_singularity", 1))
            .fluidInputs(Materials.StellarAlloy.getMolten(7200), new FluidStack(radoxPoly, 4608))
            .itemOutputs(new ItemStack(Blocks.tfftStorageField, 1, 10))
            .duration(30 * SECONDS)
            .eut(TierEU.RECIPE_UXV)
            .addTo(AssemblyLine);

        // LuV Capacitor
        GTValues.RA.stdBuilder()
            .metadata(RESEARCH_ITEM, new ItemStack(Blocks.lscLapotronicEnergyUnit, 1, 1))
            .metadata(RESEARCH_TIME, 4 * HOURS)
            .itemInputs(
                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Osmiridium, 4),
                GTOreDictUnificator.get(OrePrefixes.screw, Materials.Osmiridium, 24),
                ItemList.Circuit_Board_Elite.get(1),
                GTOreDictUnificator.get(OrePrefixes.foil, Materials.NaquadahAlloy, 64),
                new Object[] { OrePrefixes.circuit.get(Materials.LuV), 4 },
                ItemList.Circuit_Parts_Crystal_Chip_Master.get(36),
                ItemList.Circuit_Parts_Crystal_Chip_Master.get(36),
                ItemList.Circuit_Chip_HPIC.get(64),
                ItemList.Circuit_Parts_DiodeASMD.get(8),
                ItemList.Circuit_Parts_CapacitorASMD.get(8),
                ItemList.Circuit_Parts_ResistorASMD.get(8),
                ItemList.Circuit_Parts_TransistorASMD.get(8),
                GTOreDictUnificator.get(OrePrefixes.wireFine, Materials.Platinum, 64))
            .fluidInputs(new FluidStack(solderIndalloy, 720))
            .itemOutputs(new ItemStack(Blocks.lscLapotronicEnergyUnit, 1, 2))
            .duration(50 * SECONDS)
            .eut(80_000)
            .addTo(AssemblyLine);

        // ZPM Capacitor
        GTValues.RA.stdBuilder()
            .metadata(RESEARCH_ITEM, new ItemStack(Blocks.lscLapotronicEnergyUnit, 1, 2))
            .metadata(RESEARCH_TIME, 4 * HOURS)
            .itemInputs(
                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.NaquadahAlloy, 4),
                GTOreDictUnificator.get(OrePrefixes.screw, Materials.NaquadahAlloy, 24),
                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Europium, 16L),
                new Object[] { OrePrefixes.circuit.get(Materials.ZPM), 1 },
                new Object[] { OrePrefixes.circuit.get(Materials.ZPM), 1 },
                new Object[] { OrePrefixes.circuit.get(Materials.ZPM), 1 },
                new Object[] { OrePrefixes.circuit.get(Materials.ZPM), 1 },
                ItemList.Energy_LapotronicOrb2.get(8L),
                ItemList.Field_Generator_LuV.get(2),
                ItemList.Circuit_Wafer_SoC2.get(64),
                ItemList.Circuit_Wafer_SoC2.get(64),
                ItemList.Circuit_Parts_DiodeASMD.get(8),
                GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.Naquadah, 32))
            .fluidInputs(
                new FluidStack(solderIndalloy, 2880),
                new FluidStack(FluidRegistry.getFluid("ic2coolant"), 16000))
            .itemOutputs(new ItemStack(Blocks.lscLapotronicEnergyUnit, 1, 3))
            .duration(1 * MINUTES + 40 * SECONDS)
            .eut(100_000)
            .addTo(AssemblyLine);

        // UV Capacitor
        GTValues.RA.stdBuilder()
            .metadata(RESEARCH_ITEM, new ItemStack(Blocks.lscLapotronicEnergyUnit, 1, 3))
            .metadata(RESEARCH_TIME, 4 * HOURS)
            .itemInputs(
                GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 4),
                GTOreDictUnificator.get(OrePrefixes.screw, Materials.Neutronium, 24),
                GTOreDictUnificator.get(OrePrefixes.plate, Materials.Americium, 32L),
                new Object[] { OrePrefixes.circuit.get(Materials.UV), 1 },
                new Object[] { OrePrefixes.circuit.get(Materials.UV), 1 },
                new Object[] { OrePrefixes.circuit.get(Materials.UV), 1 },
                new Object[] { OrePrefixes.circuit.get(Materials.UV), 1 },
                ItemList.Energy_Module.get(8L),
                ItemList.Field_Generator_ZPM.get(2),
                ItemList.Circuit_Wafer_HPIC.get(64),
                ItemList.Circuit_Wafer_HPIC.get(64),
                ItemList.Circuit_Parts_DiodeASMD.get(16),
                GTOreDictUnificator.get(OrePrefixes.cableGt01, Materials.NaquadahAlloy, 32))
            .fluidInputs(
                new FluidStack(solderIndalloy, 2880),
                new FluidStack(FluidRegistry.getFluid("ic2coolant"), 16000))
            .itemOutputs(new ItemStack(Blocks.lscLapotronicEnergyUnit, 1, 4))
            .eut(200_000)
            .duration(1 * MINUTES + 40 * SECONDS)
            .addTo(AssemblyLine);
    }
}