/**
 * Custom recipes for AE2
 */
ServerEvents.recipes(event => {

    // Base AE2
    // ME Controller
    event.remove({ id: "ae2:network/blocks/controller" })
    event.shaped(Item.of("ae2:controller"), [
        "ABA",
        "BCB",
        "ABA"
    ], {
        A: "gtceu:dark_steel_plate",
        B: "gtceu:fluix_plate",
        C: "ae2:energy_acceptor"
    }).id("kubejs:ae2/controller")

    // Energy Acceptor
    event.remove({ id: "ae2:network/blocks/energy_energy_acceptor" })
    event.shaped(Item.of("ae2:energy_acceptor"), [
        "ABA",
        "BCB",
        "ABA"
    ], {
        A: "gtceu:electrical_steel_plate",
        B: "gtceu:fluix_plate",
        C: "gtceu:lv_machine_hull"
    }).id("kubejs:ae2/energy_acceptor")

    // ME Chest
    event.remove({ id: "ae2:network/blocks/storage_chest" })
    event.shaped(Item.of("ae2:chest"), [
        "ABA",
        "CDE",
        "FGF"
    ], {
        A: "ae2:quartz_glass",
        B: "#ae2:illuminated_panel",
        C: "gtceu:certus_quartz_plate",
        D: "gtceu:aluminium_crate",
        E: "gtceu:fluix_plate",
        F: "gtceu:dark_steel_block",
        G: "gtceu:nether_quartz_plate"
    }).id("kubejs:ae2/chest")

    // ME Drive
    event.remove({ id: "ae2:network/blocks/storage_drive" })
    event.shaped(Item.of("ae2:drive"), [
        "ABA",
        "CDC",
        "AEA"
    ], {
        A: "gtceu:aluminium_plate",
        B: "gtceu:mv_emitter",
        C: "#gtceu:circuits/lv",
        D: "ae2:chest",
        E: "gtceu:mv_sensor"
    }).id("kubejs:ae2/storage_drive")

    // Inscriber
    event.remove({ id: "ae2:network/blocks/inscribers" })
    event.shaped(Item.of("ae2:inscriber"), [
        "ABA",
        "CDA",
        "ABA"
    ], {
        A: "gtceu:dark_steel_plate",
        B: "gtceu:mv_electric_piston",
        C: "gtceu:fluix_gem",
        D: "gtceu:mv_machine_hull"
    }).id("kubejs:ae2/inscriber")

    // Patterns
    event.remove({ id: "ae2:network/crafting/patterns_blank" })
    event.shaped(Item.of("ae2:blank_pattern", 8), [
        "AAA",
        "BCB",
        "BBB"
    ], {
        A: "gtceu:fine_silver_wire",
        B: "gtceu:polyethylene_plate",
        C: "#gtceu:circuits/hv"
    }).id("kubejs:ae2/blank_pattern")

    // Pattern Provider
    event.remove({ id: "ae2:network/blocks/pattern_providers_interface" })
    event.shaped(Item.of("ae2:pattern_provider"), [
        "ABA",
        "CDE",
        "AAA"
    ], {
        A: "gtceu:aluminium_plate",
        B: "gtceu:mv_robot_arm",
        C: "ae2:annihilation_core",
        D: "gtceu:mv_machine_hull",
        E: "ae2:formation_core"
    }).id("kubejs:ae2/pattern_provider")

    // Molecular Assembler
    event.remove({ id: "ae2:network/crafting/molecular_assembler" })
    event.shaped(Item.of("ae2:molecular_assembler"), [
        "ABA",
        "CDE",
        "ABA"
    ], {
        A: "gtceu:aluminium_plate",
        B: "ae2:quartz_glass",
        C: "ae2:annihilation_core",
        D: "minecraft:crafting_table",
        E: "ae2:formation_core"
    }).id("kubejs:ae2/molecular_assembler")

    // Interface
    event.remove({ id: "ae2:network/blocks/interfaces_interface" })
    event.shaped(Item.of("ae2:interface"), [
        "ABA",
        "CDE",
        "AAA"
    ], {
        A: "gtceu:aluminium_plate",
        B: "gtceu:mv_conveyor_module",
        C: "ae2:annihilation_core",
        D: "gtceu:mv_machine_hull",
        E: "ae2:formation_core"
    }).id("kubejs:ae2/interface")

    // Requester
    event.remove({ id: "merequester:requester" })
    event.shaped(Item.of("merequester:requester"), [
        "ABA",
        "CDC",
        "AAA"
    ], {
        A: "gtceu:rhodium_plated_palladium_plate",
        B: "gtceu:luv_robot_arm",
        C: "#gtceu:circuits/zpm",
        D: "gtceu:luv_machine_hull",
    }).id("kubejs:ae2/requster")

    // Quantum Ring
    event.remove({ id: "ae2:network/blocks/quantum_ring" })
    event.shaped(Item.of("ae2:quantum_ring"), [
        "ABA",
        "DCD",
        "ABA"
    ], {
        A: "gtceu:stainless_steel_plate",
        B: "ae2:calculation_processor",
        C: "gtceu:quantum_star",
        D: "ae2:engineering_processor"
    }).id("kubejs:ae2/quantum_ring")

    // Quantum Link Chamber
    event.remove({ id: "ae2:network/blocks/quantum_link" })
    event.shaped(Item.of("ae2:quantum_link"), [
        "ABA",
        "BCB",
        "ABA"
    ], {
        A: "ae2:quartz_glass",
        B: "ae2:fluix_pearl",
        C: "gtceu:certus_quartz_plate"
    }).id("kubejs:ae2/quantum_link")

    // Storage Cell Removal
    event.remove({ id: "ae2:network/cells/item_storage_cell_1k" })
    event.remove({ id: "ae2:network/cells/item_storage_cell_4k" })
    event.remove({ id: "ae2:network/cells/item_storage_cell_16k" })
    event.remove({ id: "ae2:network/cells/item_storage_cell_64k" })
    event.remove({ id: "ae2:network/cells/item_storage_cell_256k" })

    event.remove({ id: "ae2:network/cells/fluid_storage_cell_1k" })
    event.remove({ id: "ae2:network/cells/fluid_storage_cell_4k" })
    event.remove({ id: "ae2:network/cells/fluid_storage_cell_16k" })
    event.remove({ id: "ae2:network/cells/fluid_storage_cell_64k" })
    event.remove({ id: "ae2:network/cells/fluid_storage_cell_256k" })

    event.remove({ id: "ae2:network/cells/spatial_storage_cell_2_cubed" })
    event.remove({ id: "ae2:network/cells/spatial_storage_cell_16_cubed" })
    event.remove({ id: "ae2:network/cells/spatial_storage_cell_128_cubed" })

    event.remove({ id: "ae2:network/cells/view_cell" })

    // Storage Housing
    event.remove({ id: "ae2:network/cells/item_cell_housing" })
    event.shaped(Item.of("ae2:item_cell_housing"), [
        "ABA",
        "B B",
        "ABA"
    ], {
        A: "gtceu:fine_red_alloy_wire",
        B: "gtceu:electrical_steel_plate"
    }).id("kubejs:ae2/item_cell_housing")

    event.remove({ id: "ae2:network/cells/fluid_cell_housing" })
    event.shaped(Item.of("ae2:fluid_cell_housing"), [
        "ABA",
        "B B",
        "ABA"
    ], {
        A: "gtceu:fine_red_alloy_wire",
        B: "gtceu:energetic_alloy_plate"
    })

    // CPUs
    event.remove({ id: "ae2:network/crafting/cpu_crafting_unit" })
    event.shaped(Item.of("ae2:crafting_unit"), [
        "ABA",
        "CDC",
        "ABA"
    ], {
        A: "gtceu:aluminium_plate",
        B: "ae2:calculation_processor",
        C: "ae2:fluix_glass_cable",
        D: "ae2:logic_processor"
    }).id("kubejs:ae2/cpu_crafting_unit")

    // Charger
    event.remove({ id: "ae2:network/blocks/crystal_processing_charger" })
    event.shaped(Item.of("ae2:charger"), [
        "ABA",
        "A  ",
        "ABA"
    ], {
        A: "gtceu:dark_steel_plate",
        B: "gtceu:certus_quartz_plate"
    }).id("kubejs:ae2/charger")

    // Charged Certus
    event.remove({ id: "ae2:charger/charged_certus_quartz_crystal" })
    event.remove({ id: "ae2:transform/certus_quartz_crystals" })
    event.custom({
        "type": "ae2:charger",
        "ingredient": {
            "item": "gtceu:certus_quartz_gem"
        },
        "result": {
            "item": "gtceu:charged_certus_quartz_gem"
        }
    }).id("kubejs:ae2/charged_certus_quartz_gem")

    event.recipes.gtceu.autoclave("charged_autoclave")
        .itemInputs(["gtceu:certus_quartz_gem"])
        .inputFluids("gtceu:distilled_water 100")
        .itemOutputs("gtceu:charged_certus_quartz_gem")
        .duration(20)
        .EUt(480)

    // Fix Regular Certus Grinding Recipe giving Charged Certus Dust sometimes due to using forge tags
    event.remove({ id: "gtceu:macerator/macerate_certus_quartz_gem" })
    event.recipes.gtceu.macerator("macerate_certus_quartz_gem")
        .itemInputs(["gtceu:certus_quartz_gem"])
        .itemOutputs("gtceu:certus_quartz_dust")
        .duration(20)
        .EUt(GTValues.VA[GTValues.ULV])

    // Matter Condenser
    event.remove({ id: "ae2:network/blocks/io_condenser" })
    event.shaped(Item.of("ae2:condenser"), [
        "AAA",
        "ABA",
        "AAA"
    ], {
        A: "gtceu:titanium_plate",
        B: "gtceu:quantum_star"
    }).id("kubejs:ae2/matter_condensor")

    // Storage Components
    const storage_tiers = [
        "1k",
        "4k",
        "16k",
        "64k",
        "256k",
        "1m",
        "4m",
        "16m",
        "64m",
        "256m"
    ]
    const storage_component_ingredients = [
        ["mv", "minecraft:glass", "ae2:calculation_processor", "gtceu:polyethylene", 1],
        ["hv", "minecraft:glass", "ae2:engineering_processor", "gtceu:polyethylene", 1],
        ["ev", "ae2:logic_processor", "ae2:engineering_processor", "gtceu:polyethylene", 1],
        ["iv", "ae2:logic_processor", "ae2:engineering_processor", "gtceu:polytetrafluoroethylene", 1],
        ["iv", "ae2:engineering_processor", "megacells:accumulation_processor", "gtceu:polytetrafluoroethylene", 2],
        ["luv", "ae2:engineering_processor", "megacells:accumulation_processor", "gtceu:polytetrafluoroethylene", 2],
        ["luv", "megacells:accumulation_processor", "gtceu:quantum_eye", "gtceu:polytetrafluoroethylene", 2],
        ["zpm", "megacells:accumulation_processor", "gtceu:quantum_eye", "gtceu:polybenzimidazole", 2],
        ["zpm", "megacells:accumulation_processor", "gtceu:quantum_eye", "gtceu:polybenzimidazole", 2],
    ]
    for (let index = 0; index < storage_component_ingredients.length; index++) {
        let curTier;
        if (index < 4) curTier = Item.of(`ae2:cell_component_${storage_tiers[index + 1]}`)
        else curTier = Item.of(`megacells:cell_component_${storage_tiers[index + 1]}`)

        let curIngredients = storage_component_ingredients[index];

        let toRemove;
        if (index < 4) toRemove = `ae2:network/cells/item_storage_components_cell_${storage_tiers[index + 1]}_part`
        else toRemove = `megacells:cells/cell_component_${storage_tiers[index + 1]}`

        let prevTier;
        if (index <= 4) prevTier = Item.of(`ae2:cell_component_${storage_tiers[index]}`)
        else prevTier = Item.of(`megacells:cell_component_${storage_tiers[index]}`)

        event.remove({ id: toRemove })
        event.shaped(Item.of(curTier), [
            "ABA",
            "SCS",
            "ASA"
        ], {
            A: curIngredients[1],
            B: curIngredients[2],
            C: `#gtceu:circuits/${curIngredients[0]}`,
            S: Item.of(prevTier)
        }).id(`kubejs:ae2/storage_component_${storage_tiers[index + 1]}`)

        // Cheaper ramp up to reduce exponential effect
        event.recipes.gtceu.assembler(`kubejs:ae2/${storage_tiers[index + 1]}_storage_assembler`)
            .itemInputs(
                Item.of(prevTier, 2),
                Item.of(curIngredients[1], 2),
                Item.of(curIngredients[2], 1),
                `#gtceu:circuits/${curIngredients[0]}`
            )
            .inputFluids(Fluid.of(curIngredients[3], 144 * curIngredients[4]))
            .itemOutputs(curTier)
            .EUt(240)
            .duration(200)
            .cleanroom(CleanroomType.CLEANROOM)
    }

    // 1K Storage Component recipes
    event.remove({ id: "ae2:network/cells/item_storage_components_cell_1k_part" })
    for (let index = 0; index < 5; index++) {
        let circuit = `#gtceu:circuits/${GTValues.VN[index + 1].toLowerCase()}`
        let glass = index == 0 ? "minecraft:glass" : "gtceu:tempered_glass"
        event.shaped(Item.of("ae2:cell_component_1k", Math.pow(2, index)), [
            "ABA",
            "BCB",
            "ABA"
        ], {
            A: glass,
            B: "gtceu:red_alloy_plate",
            C: circuit
        }).id(`kubejs:ae2/storage_component_1k_${Math.pow(2, index)}`)
    }

    // Wireless Receiver
    event.remove({ id: "ae2:network/wireless_part" })
    event.shaped(Item.of("ae2:wireless_receiver"), [
        " A ",
        "BCB",
        " B "
    ], {
        A: "gtceu:ev_emitter",
        B: "gtceu:titanium_plate",
        C: "ae2:fluix_pearl"
    }).id("kubejs:ae2/wirelss_receiver")

    // AE2 Cards
    event.remove({ id: "ae2:materials/basiccard" })
    event.shaped("ae2:basic_card", [
        "AB ",
        "ACB",
        "AB "
    ], {
        A: "gtceu:fine_copper_wire",
        B: "gtceu:iron_plate",
        C: "ae2:calculation_processor"
    }).id("kubejs:ae2/basic_card")
    event.remove({ id: "ae2:materials/advancedcard" })
    event.shaped("ae2:advanced_card", [
        "AB ",
        "ACB",
        "AB "
    ], {
        A: "gtceu:fine_aluminium_wire",
        B: "gtceu:electrical_steel_plate",
        C: "ae2:calculation_processor"
    }).id("kubejs:ae2/advanced_card")

    // Network Memory Card
    event.remove({ id: "ae2:tools/network_memory_card" })
    event.shapeless("ae2:memory_card", ["#gtceu:circuits/hv", "ae2:basic_card"]).id("kubejs:ae2/memory_card")

    // Crafting Card
    event.remove({ id: "ae2:materials/cardcrafting"})
    event.shapeless("ae2:crafting_card", ["minecraft:crafting_table", "ae2:basic_card", "#gtceu:circuits/ev"])

    // Level Emitter
    event.remove({ id: "ae2:network/parts/level_emitter" })
    event.shapeless("ae2:level_emitter", ["minecraft:redstone_torch", "gtceu:aluminium_plate", "ae2:calculation_processor", "#forge:rods/stainless_steel"]).id("kubejs:ae2/level_emitter")

    // Energy level Emitter
    event.remove({ id: "ae2:network/parts/energy_level_emitter" })
    event.shapeless("ae2:energy_level_emitter", ["ae2:level_emitter", "#forge:gems/certus_quartz"]).id("kubejs:ae2/energy_level_emitter").id("kubejs:ae2/energy_level_emitter")

    // Processors
    event.remove({ id: "ae2:inscriber/calculation_processor_print" })
    event.custom({
        "type": "ae2:inscriber",
        "ingredients": {
            "middle": {
                "item": "gtceu:certus_quartz_gem"
            },
            "top": {
                "item": "ae2:calculation_processor_press"
            }
        },
        "mode": "inscribe",
        "result": {
            "item": "ae2:printed_calculation_processor"
        }
    }).id("kubejs:ae2/calculation_processor_print")

    event.remove({ id: "ae2:inscriber/silicon_print" })
    const wafers = [
        ["gtceu:", "silicon_wafer"],
        ["gtceu:", "phosphorus_wafer"],
        ["gtceu:", "naquadah_wafer"],
        ["gtceu:", "neutronium_wafer"],
        ["kubejs:", "universe_wafer"]
    ]
    if (doHarderPrintedSilicon) {
        // Use only Greg wafers for printed silicon in EM
        wafers.forEach((wafer, index) => {
            event.custom({
                "type": "ae2:inscriber",
                "ingredients": {
                    "middle": {
                        "item": (wafer[0] + wafer[1])
                    },
                    "top": {
                        "item": "ae2:silicon_press"
                    }
                },
                "mode": "inscribe",
                "result": {
                    "item": "ae2:printed_silicon",
                    "count": 2 ** index
                }
            }).id("kubejs:ae2/" + wafer[1] + "_print")
        })
    } else {
        // Use AE2 silicon in other modes
        event.custom({
            "type": "ae2:inscriber",
            "ingredients": {
                "middle": {
                    "item": "ae2:silicon"
                },
                "top": {
                    "item": "ae2:silicon_press"
                }
            },
            "mode": "inscribe",
            "result": {
                "item": "ae2:printed_silicon"
            }
        }).id("kubejs:ae2/silicon_print")
    }

    event.remove({ id: "ae2:inscriber/logic_processor" })
    event.custom({
        "type": "ae2:inscriber",
        "ingredients": {
            "bottom": {
                "item": "ae2:printed_silicon"
            },
            "middle": {
                "tag": "gtceu:circuits/lv"
            },
            "top": {
                "item": "ae2:printed_logic_processor"
            }
        },
        "mode": "press",
        "result": {
            "item": "ae2:logic_processor"
        }
    }).id("kubejs:ae2/logic_processor")

    event.remove({ id: "ae2:inscriber/calculation_processor" })
    event.custom({
        "type": "ae2:inscriber",
        "ingredients": {
            "bottom": {
                "item": "ae2:printed_silicon"
            },
            "middle": {
                "tag": "gtceu:circuits/lv"
            },
            "top": {
                "item": "ae2:printed_calculation_processor"
            }
        },
        "mode": "press",
        "result": {
            "item": "ae2:calculation_processor"
        }
    }).id("kubejs:ae2/calculation_processor")

    event.remove({ id: "ae2:inscriber/engineering_processor" })
    event.custom({
        "type": "ae2:inscriber",
        "ingredients": {
            "bottom": {
                "item": "ae2:printed_silicon"
            },
            "middle": {
                "tag": "gtceu:circuits/lv"
            },
            "top": {
                "item": "ae2:printed_engineering_processor"
            }
        },
        "mode": "press",
        "result": {
            "item": "ae2:engineering_processor"
        }
    }).id("kubejs:ae2/engineering_processor")

    // Storage bus
    event.remove({ id: "ae2:network/parts/storage_bus" })
    event.shapeless("ae2:storage_bus", ["ae2:interface", "gtceu:mv_electric_piston", "gtceu:mv_electric_pump"]).id("kubejs:ae2/storage_bus")

    // Busses
    event.remove({ id: "ae2:network/parts/import_bus" })
    event.shaped("ae2:export_bus", [
        " A ",
        "DBD",
        " C "
    ], {
        A: "gtceu:mv_electric_pump",
        B: "ae2:formation_core",
        C: "gtceu:mv_electric_piston",
        D: "gtceu:aluminium_plate"
    }).id("kubejs:ae2/export_bus")
    event.remove({ id: "ae2:network/parts/export_bus" })
    event.shaped("ae2:import_bus", [
        " A ",
        "DBD",
        " C "
    ], {
        A: "gtceu:mv_electric_pump",
        B: "ae2:annihilation_core",
        C: "gtceu:mv_electric_piston",
        D: "gtceu:aluminium_plate"
    }).id("kubejs:ae2/import_bus")

    // P2P
    event.remove({ id: "ae2:network/parts/tunnels_me" })
    event.shaped("ae2:me_p2p_tunnel", [
        " A ",
        "ABA",
        "CCC"
    ], {
        A: "gtceu:stainless_steel_plate",
        B: "ae2:engineering_processor",
        C: "gtceu:fluix_plate"
    }).id("kubejs:ae2/p2p_tunnel")

    // Cable Anchor
    event.recipes.gtceu.wiremill("ae2:cable_anchor")
        .itemInputs("gtceu:steel_bolt")
        .itemOutputs("2x ae2:cable_anchor")
        .duration(20)
        .EUt(16)

    // Cables
    event.remove({ id: "ae2:network/parts/quartz_fiber_part" })
    event.remove({ id: "gtceu:shapeless/gem_to_gem_flawedgem_nether_quartz" })
    event.remove({ id: "ae2:network/cables/glass_fluix" })

    event.recipes.gtceu.wiremill("kubejs:ae2/quartz_fiber")
        .itemInputs("gtceu:certus_quartz_gem")
        .itemOutputs("ae2:quartz_fiber")
        .duration(50)
        .EUt(16)

    event.recipes.gtceu.alloy_smelter("kubejs:ae2/fluix_cable")
        .itemInputs(["gtceu:fluix_dust", "ae2:quartz_fiber"])
        .itemOutputs("2x ae2:fluix_glass_cable")
        .duration(50)
        .EUt(16)


    // Skystone
    event.recipes.gtceu.macerator("sky_stone_dust")
        .itemInputs("ae2:sky_stone_block")
        .itemOutputs("ae2:sky_dust")
        .duration(120)
        .EUt(GTValues.VA[GTValues.ULV])

    // Certus
    event.remove({ id: /^ae2:transform.*budding_quartz$/ })
    event.replaceInput(
        {},
        "ae2:charged_certus_quartz_crystal",
        "gtceu:charged_certus_quartz_gem"
    )

    event.custom({
        "type": "ae2:transform",
        "ingredients": [
            {
                "item": "gtceu:charged_certus_quartz_gem"
            },
            {
                "tag": "forge:storage_blocks/certus_quartz"
            }
        ],
        "result": {
            "count": 1,
            "item": "ae2:damaged_budding_quartz"
        }
    })
    event.custom({
        "type": "ae2:transform",
        "ingredients": [
            {
                "item": "gtceu:charged_certus_quartz_gem"
            },
            {
                "item": "ae2:damaged_budding_quartz"
            }
        ],
        "result": {
            "count": 1,
            "item": "ae2:chipped_budding_quartz"
        }
    })
    event.custom({
        "type": "ae2:transform",
        "ingredients": [
            {
                "item": "gtceu:charged_certus_quartz_gem"
            },
            {
                "item": "ae2:chipped_budding_quartz"
            }
        ],
        "result": {
            "count": 1,
            "item": "ae2:flawed_budding_quartz"
        }
    })


    event.recipes.gtceu.autoclave("flawless_budding")
        .itemInputs(["ae2:flawed_budding_quartz"])
        .inputFluids("gtceu:distilled_water 100")
        .itemOutputs("ae2:flawless_budding_quartz")
        .duration(20)
        .EUt(480)

    // Fluix
    event.remove({ id: "ae2:transform/fluix_crystal" })
    event.remove({ id: "ae2:transform/fluix_crystals" })
    event.remove({ id: "ae2:misc/deconstruction_fluix_block" })
    event.custom({
        "type": "ae2:transform",
        "ingredients": [
            {
                "item": "gtceu:charged_certus_quartz_gem"
            },
            {
                "item": "minecraft:redstone"
            },
            {
                "item": "minecraft:quartz"
            }
        ],
        "result": {
            "count": 2,
            "item": "gtceu:fluix_gem"
        }
    }).id("kubejs:ae2/fluix_gem")

    event.replaceInput({ id: /ae2/ }, "ae2:fluix_block", "gtceu:fluix_block")

    event.recipes.gtceu.mixer("fluix")
        .itemInputs("gtceu:charged_certus_quartz_gem", "minecraft:redstone", "minecraft:quartz")
        .inputFluids(Fluid.of("minecraft:water", 100))
        .itemOutputs("2x gtceu:fluix_gem")
        .duration(20)
        .EUt(7)
        .circuit(3)

    event.recipes.gtceu.compressor("fluix_plate")
        .itemInputs("gtceu:fluix_dust")
        .itemOutputs("gtceu:fluix_plate")
        .duration(400)
        .EUt(2)

    // Cable Recipes
    event.remove({ id: "ae2:network/cables/covered_fluix" })
    event.shapeless("ae2:fluix_smart_cable", ["ae2:fluix_covered_cable", "#forge:small_dusts/redstone", "#forge:small_dusts/glowstone"])
        .id("ae2:network/cables/smart_fluix")

    event.recipes.gtceu.assembler("kubejs:ae2/fluix_covered_cable_rubber")
        .itemInputs("#ae2:glass_cable")
        .inputFluids("gtceu:rubber 144")
        .itemOutputs("ae2:fluix_covered_cable")
        .duration(100)
        .EUt(7)
    event.recipes.gtceu.assembler("kubejs:ae2/fluix_covered_cable_silicone")
        .itemInputs("#ae2:glass_cable")
        .inputFluids("gtceu:silicone_rubber 72")
        .itemOutputs("ae2:fluix_covered_cable")
        .duration(100)
        .EUt(7)
    event.recipes.gtceu.assembler("kubejs:ae2/fluix_covered_cable_styrene_butadiene")
        .itemInputs("#ae2:glass_cable")
        .inputFluids("gtceu:styrene_butadiene_rubber 36")
        .itemOutputs("ae2:fluix_covered_cable")
        .duration(100)
        .EUt(7)

    // Presses
    function pressengrave(name, press, lens) {
        event.recipes.gtceu.laser_engraver(name)
            .itemInputs("gtceu:vanadium_steel_block")
            .notConsumable(lens)
            .itemOutputs(press)
            .duration(1600)
            .EUt(120)
    }

    pressengrave("kubejs:ae2/engineering_processor_press", "ae2:engineering_processor_press", "#forge:lenses/red");
    pressengrave("kubejs:ae2/calculation_processor_press", "ae2:calculation_processor_press", "#forge:lenses/blue");
    pressengrave("kubejs:ae2/silicon_press", "ae2:silicon_press", "#forge:lenses/light_blue");
    pressengrave("kubejs:ae2/logic_processor_press", "ae2:logic_processor_press", "#forge:lenses/green");
    pressengrave("kubejs:ae2/name_press", "ae2:name_press", "#forge:lenses/white");

    // MEGA cells
    event.remove({ id: "megacells:inscriber/accumulation_processor_press" })
    event.recipes.gtceu.laser_engraver("kubejs:mega/accumulation_processor_press")
        .itemInputs("gtceu:stainless_steel_block")
        .notConsumable("#forge:lenses/magenta")
        .itemOutputs("megacells:accumulation_processor_press")
        .duration(1600)
        .EUt(240)
        .cleanroom(CleanroomType.CLEANROOM)

    event.remove({ id: "megacells:inscriber/accumulation_processor_print" })
    event.custom({
        "type": "ae2:inscriber",
        "ingredients": {
            "middle": {
                "item": "gtceu:black_steel_ingot"
            },
            "top": {
                "item": "megacells:accumulation_processor_press"
            }
        },
        "mode": "inscribe",
        "result": {
            "item": "megacells:printed_accumulation_processor"
        }
    }).id("kubejs:mega/accumulation_processor_print")

    event.remove({ id: "megacells:inscriber/accumulation_processor" })
    event.custom({
        "type": "ae2:inscriber",
        "ingredients": {
            "bottom": {
                "item": "ae2:printed_silicon"
            },
            "middle": {
                "tag": "gtceu:circuits/hv"
            },
            "top": {
                "item": "megacells:printed_accumulation_processor"
            }
        },
        "mode": "press",
        "result": {
            "item": "megacells:accumulation_processor"
        }
    }).id("kubejs:mega/accumulation_processor")

    event.remove({ id: /megacells:cells\/standard\/.*storage_cell.*m$/ })

    event.remove({ id: "megacells:cells/mega_item_cell_housing" })
    event.shaped(Item.of("megacells:mega_item_cell_housing"), [
        "ABA",
        "B B",
        "ABA"
    ], {
        A: "gtceu:fine_lumium_wire",
        B: "gtceu:naquadah_plate"
    }).id("kubejs:mega/item_cell_housing")

    event.remove({ id: "megacells:cells/mega_fluid_cell_housing" })
    event.shaped(Item.of("megacells:mega_fluid_cell_housing"), [
        "ABA",
        "B B",
        "ABA"
    ], {
        A: "gtceu:fine_lumium_wire",
        B: "gtceu:crystal_matrix_plate"
    }).id("kubejs:mega/fluid_cell_housing")

    event.remove({ id: "megacells:cells/standard/bulk_item_cell" }) // recipe in SDA
    event.remove({ id: "megacells:crafting/bulk_cell_component" })

    event.remove({ id: "megacells:network/cell_dock" })
    event.recipes.gtceu.assembler("kubejs:mega/cell_dock")
        .itemInputs("4x gtceu:stainless_steel_plate", "8x gtceu:aluminium_plate", "gtceu:mv_emitter", "gtceu:mv_sensor", "2x #gtceu:circuits/mv")
        .inputFluids("gtceu:soldering_alloy 144")
        .itemOutputs("8x megacells:cell_dock")
        .EUt(240)
        .duration(200)

    event.remove({ id: "megacells:crafting/mega_crafting_unit" })
    event.shaped(Item.of("megacells:mega_crafting_unit"), [
        "ABA",
        "CDC",
        "ABA"
    ], {
        A: "gtceu:black_steel_plate",
        B: "ae2:logic_processor",
        C: "ae2:crafting_unit",
        D: "megacells:accumulation_processor"
    }).id("kubejs:mega/cpu_crafting_unit")

    // Remove Duplicates
    event.remove({ id: "megacells:crafting/mega_crafting_accelerator" })
    event.remove({ id: /megacells:network\/mega_interface/ })
    event.remove({ id: /megacells:network\/mega_pattern_provider/ })
    event.remove({ output: /megacells:sky_steel/ })

    // MAE2 compat stuff
    event.remove({ id: /mae2/, not: { id: /crafting_accelerator/ } })

    event.shaped("mae2:item_multi_p2p_tunnel", [
        " A ",
        "ABA",
        "CDC"
    ], {
        A: "gtceu:black_steel_plate",
        B: "megacells:accumulation_processor",
        C: "gtceu:sapphire_plate",
        D: "gtceu:fluix_plate"
    }).id("kubejs:ae2/multi_p2p_tunnel")


    // Greg circuits
    if (doHarderPrintedSilicon) {
        wafers.forEach((wafer, tier) => {
            event.recipes.gtceu.forming_press("ae2_printed_" + wafer[1] + "greg")
                .notConsumable("ae2:silicon_press")
                .itemInputs("4x " + wafer[0] + wafer[1])
                .itemOutputs(Item.of("ae2:printed_silicon", 4 * (2 ** tier)))
                .duration(10)
                .EUt(2048)
        })
    } else {
        event.recipes.gtceu.forming_press("ae2_printed_silicon_greg")
            .notConsumable("ae2:silicon_press")
            .itemInputs("4x ae2:silicon")
            .itemOutputs("4x ae2:printed_silicon")
            .duration(10)
            .EUt(2048)
    }

    event.recipes.gtceu.forming_press("ae2_printed_engineering_greg")
        .notConsumable("ae2:engineering_processor_press")
        .itemInputs("4x minecraft:diamond")
        .itemOutputs("4x ae2:printed_engineering_processor")
        .duration(10)
        .EUt(2048)

    event.recipes.gtceu.forming_press("ae2_printed_logic_greg")
        .notConsumable("ae2:logic_processor_press")
        .itemInputs("4x minecraft:gold_ingot")
        .itemOutputs("4x ae2:printed_logic_processor")
        .duration(10)
        .EUt(2048)

    event.recipes.gtceu.forming_press("ae2_printed_calcuation_greg")
        .notConsumable("ae2:calculation_processor_press")
        .itemInputs("4x gtceu:certus_quartz_gem")
        .itemOutputs("4x ae2:printed_calculation_processor")
        .duration(10)
        .EUt(2048)

    event.recipes.gtceu.forming_press("mega_printed_accumulation_greg")
        .notConsumable("megacells:accumulation_processor_press")
        .itemInputs("4x gtceu:black_steel_plate")
        .itemOutputs("4x megacells:printed_accumulation_processor")
        .duration(10)
        .EUt(2048)

    // Processors
    event.recipes.gtceu.circuit_assembler("ae2_engineering_processor_greg_1x")
        .itemInputs("ae2:printed_engineering_processor", "ae2:printed_silicon", "#gtceu:circuits/lv")
        .inputFluids("gtceu:soldering_alloy 72")
        .itemOutputs("2x ae2:engineering_processor")
        .duration(100)
        .EUt(2560)
        .cleanroom(CleanroomType.CLEANROOM)

    event.recipes.gtceu.circuit_assembler("ae2_logic_processor_greg_1x")
        .itemInputs("ae2:printed_logic_processor", "ae2:printed_silicon", "#gtceu:circuits/lv")
        .inputFluids("gtceu:soldering_alloy 72")
        .itemOutputs("2x ae2:logic_processor")
        .duration(100)
        .EUt(2560)
        .cleanroom(CleanroomType.CLEANROOM)

    event.recipes.gtceu.circuit_assembler("ae2_calculation_processor_greg_1x")
        .itemInputs("ae2:printed_calculation_processor", "ae2:printed_silicon", "#gtceu:circuits/lv")
        .inputFluids("gtceu:soldering_alloy 72")
        .itemOutputs("2x ae2:calculation_processor")
        .duration(100)
        .EUt(2560)
        .cleanroom(CleanroomType.CLEANROOM)

    event.recipes.gtceu.circuit_assembler("mega_accumulation_processor_greg_1x")
        .itemInputs("megacells:printed_accumulation_processor", "ae2:printed_silicon", "#gtceu:circuits/hv")
        .inputFluids("gtceu:soldering_alloy 72")
        .itemOutputs("megacells:accumulation_processor")
        .duration(10)
        .EUt(2560)
        .cleanroom(CleanroomType.CLEANROOM)
    // ExtendedAE

    // Pattern Modifier (NAE2's Pattern Multitool)
    event.remove({ id: "expatternprovider:pattern_modifier" })
    event.shapeless("expatternprovider:pattern_modifier", ["ae2:calculation_processor", "ae2:blank_pattern", "ae2:logic_processor"]).id("kubejs:epp/pattern_modifier")

    // Extended Pattern Provider
    event.remove({ id: "expatternprovider:epp" })
    event.recipes.gtceu.assembler("kubejs:epp/ex_pattern_provider")
        .itemInputs("2x ae2:pattern_provider", "2x ae2:capacity_card", "4x gtceu:aluminium_plate")
        .itemOutputs("expatternprovider:ex_pattern_provider")
        .duration(180)
        .EUt(128)
        .circuit(4)

    event.remove({ id: "expatternprovider:epp_upgrade" })
    event.recipes.gtceu.assembler("kubejs:epp/ex_pattern_provider_upgrade")
        .itemInputs("ae2:pattern_provider", "2x ae2:capacity_card", "4x gtceu:aluminium_plate")
        .itemOutputs("expatternprovider:pattern_provider_upgrade")
        .duration(180)
        .EUt(128)
        .circuit(3)

    // Extended Interface
    event.remove({ id: "expatternprovider:ei" })
    event.recipes.gtceu.assembler("kubejs:epp/ex_interface")
        .itemInputs("2x ae2:interface", "2x ae2:capacity_card", "4x gtceu:aluminium_plate")
        .itemOutputs("expatternprovider:ex_interface")
        .duration(180)
        .EUt(128)
        .circuit(4)

    event.remove({ id: "expatternprovider:ei_upgrade" })
    event.recipes.gtceu.assembler("kubejs:epp/ex_interface_upgrade")
        .itemInputs("ae2:interface", "2x ae2:capacity_card", "4x gtceu:aluminium_plate")
        .itemOutputs("expatternprovider:interface_upgrade")
        .duration(180)
        .EUt(128)
        .circuit(3)

    // Oversize Interface
    event.remove({ id: "expatternprovider:oversize_interface" })
    event.recipes.gtceu.assembler("kubejs:epp/oversize_interface")
        .itemInputs("8x expatternprovider:ex_interface", "8x ae2:capacity_card", "8x gtceu:stainless_steel_plate")
        .itemOutputs("expatternprovider:oversize_interface")
        .duration(240)
        .EUt(512)

    // Extended MA
    event.remove({ id: "expatternprovider:ex_molecular_assembler" })
    event.recipes.gtceu.assembler("kubejs:epp/ex_molecular_assembler")
        .itemInputs("8x ae2:molecular_assembler", "8x gtceu:fluix_plate", "8x ae2:capacity_card")
        .itemOutputs("expatternprovider:ex_molecular_assembler")
        .duration(240)
        .EUt(512)

    // Extended Inscriber
    event.remove({ id: "expatternprovider:ex_inscriber" })
    event.recipes.gtceu.assembler("kubejs:epp/ex_inscriber")
        .itemInputs("4x ae2:inscriber", "2x ae2:capacity_card")
        .itemOutputs("expatternprovider:ex_inscriber")
        .duration(180)
        .EUt(32)

    // Extended Charger
    event.remove({ id: "expatternprovider:ex_charger" })
    event.recipes.gtceu.assembler("kubejs:epp/ex_charger")
        .itemInputs("4x ae2:charger", "2x ae2:capacity_card")
        .itemOutputs("expatternprovider:ex_charger")
        .duration(180)
        .EUt(32)

    // Tag storage bus
    event.remove({ id: "expatternprovider:tag_storage_bus" })
    event.recipes.gtceu.assembler("kubejs:epp/tag_storage_bus")
        .itemInputs("ae2:storage_bus", "2x gtceu:aluminium_plate", "ae2:logic_processor")
        .itemOutputs("expatternprovider:tag_storage_bus")
        .duration(180)
        .EUt(32)

    // Mod storage bus
    event.remove({ id: "expatternprovider:mod_storage_bus" })
    event.recipes.gtceu.assembler("kubejs:epp/mod_storage_bus")
        .itemInputs("ae2:storage_bus", "2x gtceu:aluminium_plate", "ae2:calculation_processor")
        .itemOutputs("expatternprovider:mod_storage_bus")
        .duration(180)
        .EUt(32)

    // Extended Pattern Access Terminal
    // I do want to eventually just outright remove the default one in favor of this one, but will happen once EPAT gets a fullblock eng block
    event.remove({ id: "expatternprovider:epa" })
    event.shapeless("expatternprovider:ex_pattern_access_part", ["ae2:pattern_access_terminal", "ae2:logic_processor"]).id("kubejs:epp/epa")
    event.remove({ id: "expatternprovider:epa_upgrade" })
    event.shapeless("expatternprovider:ex_pattern_access_part", ["#ae2:illuminated_panel", "ae2:logic_processor"]).id("kubejs:epp/epa_upgrade")

    // ExtendedAE Silicon Block
    event.remove({id:"expatternprovider:silicon_block"})

    // Circuit cutter
    event.remove({ id: "expatternprovider:circuit_cutter" })
    event.remove({ id: /expatternprovider.*cutter/ })

    // ME packing tape
    event.shapeless("expatternprovider:me_packing_tape", ["gtceu:basic_tape", "gtceu:fluix_dust"]).id("expatternprovider:tape")

    // Assembler Matrix
    // Assembler Matrix Frame
    event.remove({ id: "expatternprovider:assembler_matrix_frame" })
    event.recipes.gtceu.assembler("kubejs:epp/assembler_matrix_frame")
        .itemInputs("4x gtceu:mythril_plate", "4x gtceu:blue_steel_frame", "gtceu:plascrete", "#gtceu:circuits/hv")
        .inputFluids("gtceu:polyethylene 288")
        .itemOutputs("4x expatternprovider:assembler_matrix_frame")
        .duration(150)
        .EUt(1920)

    // Assembler Matrix Wall
    event.remove({ id: "expatternprovider:assembler_matrix_wall" })
    event.recipes.gtceu.assembler("kubejs:epp/assembler_matrix_wall")
        .itemInputs("expatternprovider:assembler_matrix_frame", "gtceu:hv_electric_motor")
        .itemOutputs("expatternprovider:assembler_matrix_wall")
        .circuit(1)
        .duration(100)
        .EUt(1920)

    // Assembler Matrix Glass
    event.remove({ id: "expatternprovider:assembler_matrix_glass" })
    event.recipes.gtceu.assembler("kubejs:epp/assembler_matrix_glass")
        .itemInputs("expatternprovider:assembler_matrix_frame", "gtceu:hv_electric_motor", "ae2:quartz_glass")
        .itemOutputs("expatternprovider:assembler_matrix_glass")
        .circuit(2)
        .duration(100)
        .EUt(1920)

    // Assembler Matrix Pattern Core
    event.remove({ id: "expatternprovider:assembler_matrix_pattern" })
    event.recipes.gtceu.assembler("kubejs:epp/assembler_matrix_pattern")
        .itemInputs("4x expatternprovider:assembler_matrix_frame", "4x ae2:engineering_processor", "expatternprovider:ex_pattern_provider", "6x ae2:blue_lumen_paint_ball")
        .inputFluids("gtceu:polyethylene 288")
        .itemOutputs("expatternprovider:assembler_matrix_pattern")
        .duration(150)
        .EUt(1920)

    // Assembler Matrix Craft Core
    event.remove({ id: "expatternprovider:assembler_matrix_crafter" })
    event.recipes.gtceu.assembler("kubejs:epp/assembler_matrix_crafter")
        .itemInputs("4x expatternprovider:assembler_matrix_frame", "4x ae2:engineering_processor", "expatternprovider:ex_molecular_assembler", "6x ae2:purple_lumen_paint_ball")
        .inputFluids("gtceu:polyethylene 288")
        .itemOutputs("expatternprovider:assembler_matrix_crafter")
        .duration(150)
        .EUt(1920)

    // Assembler Matrix Speed Core
    event.remove({ id: "expatternprovider:assembler_matrix_speed" })
    event.recipes.gtceu.assembler("kubejs:epp/assembler_matrix_speed")
        .itemInputs("4x expatternprovider:assembler_matrix_frame", "4x megacells:accumulation_processor", "mae2:4x_crafting_accelerator", "expatternprovider:ex_pattern_provider", "expatternprovider:ex_molecular_assembler", "6x ae2:red_lumen_paint_ball")
        .inputFluids("gtceu:polyethylene 288")
        .itemOutputs("expatternprovider:assembler_matrix_speed")
        .duration(150)
        .EUt(1920)

    // Misc stuff
    event.shaped("expatternprovider:ingredient_buffer", [
        "ISI",
        "GCG",
        "ISI"
    ], {
        I: "gtceu:iron_plate",
        S: "ae2:cell_component_1k",
        G: "ae2:quartz_glass",
        C: "gtceu:lv_hermetic_casing"
    }).id("expatternprovider:ingredient_buffer")

    event.replaceInput({ id: "expatternprovider:crystal_fixer" }, "minecraft:iron_ingot", "gtceu:iron_plate")

    event.remove({ id: "expatternprovider:ex_drive" })
    event.recipes.gtceu.assembler("kubejs:epp/ex_drive")
        .itemInputs("2x ae2:drive", "4x gtceu:fluix_plate", "ae2:capacity_card")
        .itemOutputs("expatternprovider:ex_drive")
        .duration(240)
        .EUt(128)
        .circuit(4)

    event.remove({ id: "expatternprovider:ex_drive_upgrade" })
    event.recipes.gtceu.assembler("kubejs:epp/ex_drive_upgrade")
        .itemInputs("1x ae2:drive", "4x gtceu:fluix_plate", "ae2:capacity_card")
        .itemOutputs("expatternprovider:drive_upgrade")
        .duration(240)
        .EUt(128)
        .circuit(3)

    // Quantum Bridge Card
    event.remove({ id: "ae2wtlib:quantum_bridge_card" })
    event.custom({
        type: "ae2:inscriber",
        ingredients: {
            bottom: {
                item: "ae2:singularity"
            },
            middle: {
                item: "ae2:advanced_card"
            },
            top: {
                item: "ae2:singularity"
            }
        },
        mode: "press",
        result: { item: "ae2wtlib:quantum_bridge_card" }
    }).id("kubejs:ae2wtlib/quantum_bridge_card")

    // Fluix Dust Inscriber
    // event.remove({ id: 'jei:ae2/inscriber/fluix_dust' }) (I don't know what's wrong with that recipe but it doesn't want to be removed or replaceoutput)
    event.custom({
        "type": "ae2:inscriber",
        "ingredients": {
            "middle": {
                "item": "gtceu:fluix_gem"
            }
        },
        "mode": "inscribe",
        "result": {
            "item": "gtceu:fluix_dust"
        }
    }).id("kubejs:ae2/fluix_dust_inscriber")

    // Certus Quartz Crystal
    event.remove({ input: "ae2:certus_quartz_crystal" })
    event.replaceOutput(
        { output: "ae2:certus_quartz_crystal" },
        "ae2:certus_quartz_crystal",
        "gtceu:certus_quartz_gem"
    )

    // Certus Quartz Block
    event.remove({ output: "gtceu:certus_quartz_block" })
    event.recipes.gtceu.compressor("kubejs:certus_quartz_block")
        .itemInputs(["4x gtceu:certus_quartz_gem"])
        .itemOutputs("gtceu:certus_quartz_block")
        .duration(300)
        .EUt(2)

    event.shaped(Item.of("gtceu:certus_quartz_block"), [
        "AA",
        "AA"
    ], {
        A: "#forge:gems/certus_quartz"
    }).id("kubejs:gtceu/certus_quartz_block")

    // Vibrant Quartz Glass
    event.remove({ output: "ae2:quartz_vibrant_glass" })
    event.recipes.gtceu.alloy_smelter("kubejs:vibrant_quartz_glass")
        .itemInputs("ae2:quartz_glass", "gtceu:vibrant_alloy_dust")
        .itemOutputs("ae2:quartz_vibrant_glass")
        .duration(200)
        .EUt("128")

    // Terminal
    event.remove({ id: "ae2:network/parts/terminals" })
    event.shapeless("ae2:terminal", ["#ae2:illuminated_panel", "#gtceu:circuits/lv"]).id("kubejs:ae2_terminal")

    // Cable stuff
    const colors = ["black", "blue", "brown", "cyan", "gray", "green", "light_blue", "light_gray", "lime", "magenta", "orange", "pink", "purple", "red", "white", "yellow"]

    function washToFluix(wash) {
        event.shaped(`8x ae2:fluix_${wash}_cable`, [
            "CCC",
            "CDC",
            "CCC"
        ], {
            C: `#ae2:${wash}_cable`,
            D: "#ae2:can_remove_color"
        })
    }

    function coveredDenseCable(color) {
        event.shaped(`ae2:${color}_covered_dense_cable`, [
            "CC",
            "CC"
        ], {
            C: `ae2:${color}_covered_cable`
        })
    }

    function smartDenseCable(color) {
        event.shaped(`ae2:${color}_smart_dense_cable`, [
            "CC",
            "CC"
        ], {
            C: `ae2:${color}_smart_cable`
        })
    }


    washToFluix("covered")
    washToFluix("covered_dense")
    washToFluix("smart_dense")
    washToFluix("glass")
    washToFluix("smart")

    //    colors.forEach(coloredCoveredCable)
    colors.forEach(coveredDenseCable)
    colors.forEach(smartDenseCable)


    // BetterP2P
    event.shapeless("betterp2p:advanced_memory_card", ["ae2:memory_card", "ae2:network_tool"])

    // Network Analyser
    event.remove({ id:"ae2netanalyser:analyser"})
    event.shaped(Item.of("ae2netanalyser:network_analyser"), [
        "R R",
        "DSD",
        "FDF"
    ], {
        R: "gtceu:electrical_steel_rod",
        D: "gtceu:dark_steel_plate",
        F: "gtceu:fluix_plate",
        S: "gtceu:mv_sensor"
    }).id("kubejs:ae2netanalyser/network_analyser")
})
