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.RecipeMaps
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.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 net.minecraft.init.Blocks
import net.minecraft.util.ResourceLocation

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



public class MetaTileEntityFissionReactorMK1 extends RecipeMapMultiblockController {

    private static final RecipeMap<SimpleRecipeBuilder> FISSION_REACTOR_MK_1_RECIPES = new RecipeMap<>("fission_reactor_mk1", 2, 1, 1, 1, new SimpleRecipeBuilder(), false)

    public MetaTileEntityFissionReactorMK1(ResourceLocation metaTileEntityId) {
        super(metaTileEntityId, FISSION_REACTOR_MK_1_RECIPES)
    }

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

    @Override
    protected BlockPattern createStructurePattern() {
        return FactoryBlockPattern.start()
                .aisle(" CCCCC ", "CCF FCC", "CF   FC", "C     C", "CF   FC", "CCF FCC", " CCCCC ")
                .aisle("CCF FCC", "CHHHHHC", "FHZZZHF", " ZZZZZ ", "FHZZZHF", "CHHHHHC", "CCF FCC")
                .aisle("CF   FC", "FHHHHHF", " ZMUMZ ", " ZMUMZ ", " ZMUMZ ", "FHHHHHF", "CF   FC")
                .aisle("C     C", " HHHHH ", " ZUOUZ ", " ZUOUZ ", " ZUOUZ ", " HHHHH ", "C     C")
                .aisle("CF   FC", "FHHHHHF", " ZMUMZ ", " ZMUMZ ", " ZMUMZ ", "FHHHHHF", "CF   FC")
                .aisle("CCF FCC", "CHHHHHC", "FHZZZHF", " ZZZZZ ", "FHZZZHF", "CHHHHHC", "CCF FCC")
                .aisle(" CCSCC ", "CCF FCC", "CF   FC", "C     C", "CF   FC", "CCF FCC", " CCCCC ")
                .where('S' as char, selfPredicate())
                .where('C' as char, states(blockstate('contenttweaker:fission_proof_inconel_718_machine_casing'))
                    .setMinGlobalLimited(39)
                    .or(autoAbilities()))
                .where('F' as char, states(blockstate('gregtech:meta_block_frame_2004', 'variant=gregtech__inconel_718')))
                .where('H' as char, states(blockstate('contenttweaker:hafnium_fission_casing')))
                .where('Z' as char, states(blockstate('contenttweaker:zirconium_fission_casing')))
                .where('M' as char, states(blockstate('gregtech:meta_block_compressed_2004', 'variant=gregtech__boron_carbide')))
                .where('U' as char, states(blockstate('contenttweaker:nuclear_fuel_rod')))
                .where('O' as char, states(blockstate('contenttweaker:nuclear_control_rod')))
                .where(' ' as char, TraceabilityPredicate.ANY)
                .build()
    }

    public boolean hasMaintenanceMechanics() {
        return true;
    }

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

    //@Override
    protected ICubeRenderer getFrontOverlay() {
        return CustomTextures.FISSION_REACTOR_OVERLAY
    }
}