/**
 * Atomic Reconstructor singleblock
 */

ServerEvents.recipes(event => {
    const reconstructedItems = [
        ["minecraft:redstone", "gtceu:restonia_gem", GTValues.VA[GTValues.MV], "restonia"],
        ["minecraft:iron_ingot", "gtceu:enori_gem", GTValues.VA[GTValues.MV], "enori"],
        ["minecraft:coal", "gtceu:void_gem", GTValues.VA[GTValues.MV], "void"],
        ["minecraft:lapis_lazuli", "gtceu:palis_gem", GTValues.VA[GTValues.MV], "palis"],
        ["minecraft:diamond", "gtceu:diamatine_gem", GTValues.VA[GTValues.MV], "diamatine"],
        ["minecraft:emerald", "gtceu:emeradic_gem", GTValues.VA[GTValues.MV], "emeradic"],
        ["minecraft:coal_block", "gtceu:void_block", GTValues.VA[GTValues.MV], "void_block"],
        ["#forge:storage_blocks/redstone", "gtceu:restonia_block", GTValues.VA[GTValues.MV], "restonia_block"],
        ["#forge:storage_blocks/lapis", "gtceu:palis_block", GTValues.VA[GTValues.MV], "palis_block"],
        ["#forge:storage_blocks/diamond", "gtceu:diamatine_block", GTValues.VA[GTValues.MV], "diamatine_block"],
        ["#forge:storage_blocks/emerald", "gtceu:emeradic_block", GTValues.VA[GTValues.MV], "emeradic_block"],
        ["#forge:storage_blocks/iron", "gtceu:enori_block", GTValues.VA[GTValues.MV], "enori_block"],
        ["minecraft:sand", "minecraft:soul_sand", GTValues.VA[GTValues.MV], "soul_sand"],
        ["minecraft:quartz", "minecraft:prismarine_shard", GTValues.VA[GTValues.MV], "prismarine_shard"],
        ["minecraft:rotten_flesh", "minecraft:leather", GTValues.VA[GTValues.LV], "leather"],
        ["gtceu:topaz_gem", "minecraft:prismarine_crystals", GTValues.VA[GTValues.MV], "prismarine_crystals"],
        ["gtceu:steel_ingot", "gtceu:damascus_steel_ingot", GTValues.VA[GTValues.MV], "damascus_steel"],
        ["gtceu:diamatine_block", "kubejs:starry_diamond_block", GTValues.VA[GTValues.MV], "starry_diamond"],
        ["gtceu:obsidian_dust", "enderio:grains_of_infinity", GTValues.VA[GTValues.LV], "temp_grains"],
        ["minecraft:dried_kelp", "minecraft:wither_rose", GTValues.VA[GTValues.LV], "wither_rose"],
        ["gtceu:plant_ball", "minecraft:kelp", GTValues.VA[GTValues.LV], "kelp"],
        ["minecraft:obsidian", "minecraft:crying_obsidian", GTValues.VA[GTValues.LV], "crying_obsidian"],
        ["#forge:dyes/black", "minecraft:ink_sac", GTValues.VA[GTValues.LV], "ink_sac"],
        ["minecraft:ink_sac", "minecraft:glow_ink_sac", GTValues.VA[GTValues.LV], "glow_ink_sac"],
        ["thermal:rubberwood_sapling", "gtceu:rubber_sapling", GTValues.VA[GTValues.LV], "rubberwood_to_rubber"],
        ["gtceu:rubber_sapling", "thermal:rubberwood_sapling", GTValues.VA[GTValues.LV], "rubber_to_rubberwood"],
    ]

    const crystals = ["enori", "void", "palis", "diamatine", "restonia", "emeradic"]
    crystals.forEach(crystal => {
        event.remove({ id: `gtceu:shaped/gear_${crystal}` })
        event.remove({ id: `gtceu:shaped/gear_${crystal}_empowered` })
    })

    // Black Quartz
    event.recipes.gtceu.electrolyzer("kubejs:black_quartz_dust")
        .itemInputs("4x gtceu:quartzite_dust")
        .itemOutputs("gtceu:black_quartz_dust")
        .duration(400)
        .EUt(90)
    event.recipes.gtceu.autoclave("kubejs:black_quartz_gem__water")
        .itemInputs("gtceu:black_quartz_dust")
        .inputFluids(Fluid.of("minecraft:water", 250))
        .itemOutputs("gtceu:black_quartz_gem")
        .duration(1200)
        .EUt(24)
    event.recipes.gtceu.autoclave("kubejs:black_quartz_gem__distilled")
        .itemInputs("gtceu:black_quartz_dust")
        .inputFluids(Fluid.of("gtceu:distilled_water", 50))
        .itemOutputs("gtceu:black_quartz_gem")
        .duration(600)
        .EUt(24)

    // Black quartz, tag-based recipes for Tinted Glass
    event.replaceInput({ output: "minecraft:tinted_glass" }, "minecraft:glass", "#forge:glass")
    event.replaceInput({ output: "minecraft:tinted_glass" }, "minecraft:amethyst_shard", "#forge:gems/amethyst")
    event.shaped("2x minecraft:tinted_glass", [
        " Q ",
        "QGQ",
        " Q "
    ], {
        Q: "#forge:gems/black_quartz",
        G: "#forge:glass"
    }).id("kubejs:tinted_glass_black_quartz")
    event.recipes.gtceu.assembler("tinted_glass_black_quartz")
        .itemInputs("2x #forge:gems/black_quartz", "#forge:glass")
        .itemOutputs("minecraft:tinted_glass")
        .duration(100)
        .EUt(GTValues.VA[GTValues.LV])

    // Reconstruction
    reconstructedItems.forEach(([input, output, eut, id]) => {
        event.recipes.gtceu.atomic_reconstruction(`kubejs:${id}`)
            .itemInputs(input)
            .itemOutputs(output)
            .duration(20)
            .EUt(eut)
    })

    // Universal Circuits
    const tiers = ["ulv", "lv", "mv", "hv", "ev", "iv", "luv", "zpm", "uv", "uhv", "uev", "uiv"]
    tiers.forEach((level) => {
        event.recipes.gtceu.atomic_reconstruction(`kubejs:${level}_universal_circuit`)
            .itemInputs(`#gtceu:circuits/${level}`)
            .itemOutputs(`kubejs:${level}_universal_circuit`)
            .EUt(32)
            .duration(5)
    })

    const reconstructorrecipe = [
        ["lv", "lead"],
        ["mv", "rose_gold"],
        ["hv", "beryllium"],
        ["ev", "platinum"],
        ["iv", "rhodium"],
        ["luv", "osmiridium"],
        ["zpm", "naquadah"],
        ["uv", "duranium"],
        ["uhv", "tritanium"],
        ["uev", "omnium"],
        ["uiv", "holmium"]
    ]
    reconstructorrecipe.forEach(([tier, plate]) => {
        event.shaped(`gtceu:${tier}_atomic_reconstructor`, [
            "CPC",
            "EHE",
            "PPM"
        ], {
            P: `gtceu:${plate}_plate`,
            E: `gtceu:${tier}_emitter`,
            H: `gtceu:${tier}_machine_hull`,
            C: `#gtceu:circuits/${tier}`,
            M: `gtceu:${tier}_electric_motor`
        }).id(`kubejs:shaped/${tier}_atomic_reconstructor`)
    })

    // Crystal Gears
    crystals.forEach(crystal => {
        event.recipes.gtceu.extruder(`kubejs:${crystal}_gear`)
            .itemInputs(`4x gtceu:${crystal}_gem`)
            .itemOutputs(`gtceu:${crystal}_gear`)
            .notConsumable("gtceu:gear_extruder_mold")
            .duration(80)
            .EUt(56)
    })

    // Flower conversion convenience recipes
    const flowerCycle = [
        "dandelion",
        "poppy",
        "blue_orchid",
        "allium",
        "azure_bluet",
        "red_tulip",
        "orange_tulip",
        "white_tulip",
        "pink_tulip",
        "oxeye_daisy",
        "cornflower",
        "lily_of_the_valley",
        // 'sunflower',  //Flowers that give 2x as much dye are excluded. Sorry!
        // 'lilac',
        // 'rose_bush',
        // 'peony',
        "spore_blossom",
        "wither_rose",
        "dead_bush"
    ]
    reconstructCycle(flowerCycle);

    // Fungus conversion convenience recipes
    const fungusCycle = [
        "red_mushroom",
        "brown_mushroom",
        "nether_wart"
    ]
    reconstructCycle(fungusCycle);

    /**
     * Creates a "cycle" of Atomic Reconstructor recipes that allow players to transmute
     * any one item in the cycle into any other, through repeated applications of Atomic Reconstruction.
     * Best applied to plants or fungi, where getting one enables you to get many more easily.
     *
     * @param {Ingredient[]} cycle The array of ingredients for the AR to cycle through
     */
    function reconstructCycle(cycle) {
        cycle.forEach((flower, index) => {
            let curItem = cycle[index];
            let nextItem = cycle[(index + 1) % cycle.length];
            event.recipes.gtceu.atomic_reconstruction(`gtceu:${curItem}_to_${nextItem}`)
                .itemInputs(`minecraft:${curItem}`)
                .itemOutputs(`minecraft:${nextItem}`)
                .EUt(GTValues.VA[GTValues.LV])
                .duration(30)
        })
    }
})
