package postInit.machines

import gregtech.api.metatileentity.MetaTileEntity
import gregtech.common.metatileentities.MetaTileEntities
import gregtech.api.metatileentity.interfaces.IGregTechTileEntity
import gregtech.api.metatileentity.multiblock.IMultiblockPart
import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController
import gregtech.api.pattern.BlockPattern
import gregtech.api.pattern.FactoryBlockPattern
import gregtech.api.recipes.RecipeMap
import gregtech.api.recipes.builders.SimpleRecipeBuilder
import gregtech.client.renderer.ICubeRenderer

import gregtech.client.renderer.texture.Textures
import gregicality.multiblocks.api.render.GCYMTextures

---------------------

import preInit.CustomTexturesClient

---------------------

import gregtech.common.blocks.BlockMetalCasing
import gregtech.common.blocks.BlockFusionCasing
import gregtech.common.blocks.BlockGlassCasing
import gregtech.common.blocks.BlockCleanroomCasing
import gregtech.common.blocks.BlockMachineCasing
import gregtech.common.blocks.BlockBoilerCasing
import gregtech.common.blocks.BlockMultiblockCasing
import gregtech.common.blocks.BlockTurbineCasing
import gregtech.api.unification.material.Materials
import gregtech.common.blocks.MetaBlocks
import gregtech.api.pattern.TraceabilityPredicate
import gregtech.api.metatileentity.multiblock.MultiblockAbility
import gregicality.multiblocks.common.block.GCYMMetaBlocks
import gregicality.multiblocks.common.block.blocks.BlockLargeMultiblockCasing
import gregicality.multiblocks.common.block.blocks.BlockUniqueCasing

import net.minecraft.init.Blocks
import net.minecraft.util.ResourceLocation

import net.minecraftforge.fml.relauncher.Side
import net.minecraftforge.fml.relauncher.SideOnly



public class MetaTileEntityLargeScaleExtremeSuperSifter extends RecipeMapMultiblockController {

    private static final RecipeMap<SimpleRecipeBuilder> LARGE_SCALE_EXTREME_SUPER_SIFTER_RECIPES = new RecipeMap<>("large_scale_extreme_super_sifter", 2, 12, 0, 0, new SimpleRecipeBuilder(), false)


    public MetaTileEntityLargeScaleExtremeSuperSifter(ResourceLocation metaTileEntityId) {
        super(metaTileEntityId, LARGE_SCALE_EXTREME_SUPER_SIFTER_RECIPES)
    }

    @Override
    public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) {
        return new MetaTileEntityLargeScaleExtremeSuperSifter(metaTileEntityId)
    }

    @Override
    protected BlockPattern createStructurePattern() {
        return FactoryBlockPattern.start()
                .aisle("CCCCC", "GEMEG", "GMMMG", "GEMEG", "CCCCC")
                .aisle("CUUUC", "MTTTM", "EAAAE", "MTTTM", "CUUUC")
                .aisle("CUUUC", "MTTTM", "MAAAM", "MTTTM", "CUUUC")
                .aisle("CUUUC", "MTTTM", "EAAAE", "MTTTM", "CUUUC")
                .aisle("CCCCC", "GEMEG", "GMSMG", "GEMEG", "CCCCC")
                .where('S' as char, selfPredicate())
                .where('M' as char, states(blockstate('gcym:large_multiblock_casing', 'variant=stress_proof_casing'))
                        .setMinGlobalLimited(11)
                        .or(autoAbilities(true [Energy], true [Maintenance], true [Input Bus], true [Output Bus], true [Input Hatch], true [Output Hatch], true [?Muffler Hatch?])))
                .where('C' as char, states(blockstate('gregtech:metal_casing', 'variant=tungstensteel_robust')))
                .where('G' as char, states(blockstate('gregtech:multiblock_casing', 'variant=grate')))
                .where('E' as char, states(blockstate('gregtech:metal_casing', 'variant=steel_solid')))
                .where('A' as char, states(blockstate('gregtech:turbine_casing', 'variant=steel_gearbox')))
                .where('U' as char, states(blockstate('gregtech:turbine_casing', 'variant=tungstensteel_gearbox')))
                .where('T' as char, states(blockstate('gregtech:meta_block_frame_7', 'variant=gregtech__titanium'))) 
                .where(' ' as char, TraceabilityPredicate.ANY)
                .build()
    }

    public boolean hasMaintenanceMechanics() {
        return true;
    }

--------------------

    @Override
    @SideOnly(Side.CLIENT)
    public ICubeRenderer getBaseTexture(IMultiblockPart sourcePart) {
        return CustomTextures.MENDELEVIUM_CASING
    }

--------------------

    //@Override
    protected ICubeRenderer getFrontOverlay() {
        return Textures.SIFTER_OVERLAY
    }
}