package com.dairymoose.modernlife.blocks;

import com.dairymoose.modernlife.core.CustomBlocks;
import com.dairymoose.modernlife.core.McpConstants;
import com.dairymoose.modernlife.core.ModernLifeCommon;
import com.dairymoose.modernlife.util.ModernLifeUtil;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;
import javax.annotation.Nullable;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TextComponent;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.StringRepresentable;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.ExperienceOrb;
import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.LiquidBlock;
import net.minecraft.world.level.block.SimpleWaterloggedBlock;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.AttachFace;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
import net.minecraft.world.level.block.state.properties.EnumProperty;
import net.minecraft.world.level.block.state.properties.IntegerProperty;
import net.minecraft.world.level.block.state.properties.Property;
import net.minecraft.world.level.material.FlowingFluid;
import net.minecraft.world.level.material.Fluid;
import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.level.material.Fluids;
import net.minecraft.world.level.material.LavaFluid;
import net.minecraft.world.level.material.WaterFluid;
import net.minecraft.world.phys.shapes.BooleanOp;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.EntityCollisionContext;
import net.minecraft.world.phys.shapes.Shapes;
import net.minecraft.world.phys.shapes.VoxelShape;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;

/* loaded from: outputsrg.jar:com/dairymoose/modernlife/blocks/GrateBlock.class */
public class
GrateBlock extends AbstractPanelBlock implements SimpleWaterloggedBlock {
    private boolean allowAllLiquids = true;
    private static final int MS_PER_TICK = 50;
    private static final float GRATE_SLOWDOWN_FACTOR = 1.0f;
    private final ScheduledExecutorService scheduler;
    public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED;
    public static final IntegerProperty LEVEL = IntegerProperty.create("level", 0, 8);
    public static final EnumProperty<FluidType> FLUIDTYPE = EnumProperty.create("fluidtype", FluidType.class);
    private static final HashSet<BlockPos> respawning = new HashSet<>();
    private static final HashMap<BlockPos, Integer> waterLevel = new HashMap<>();
    protected static final VoxelShape SHAPE_FLOOR_NORTH = (VoxelShape) Stream.of(Block.box(0.0d, 0.0d, 0.0d, 16.0d, 1.0d, 16.0d)).reduce((v1, v2) -> {
        return Shapes.join(v1, v2, BooleanOp.OR);
    }).get();
    protected static final VoxelShape SHAPE_WALL_NORTH = (VoxelShape) Stream.of(Block.box(0.0d, 0.0d, 15.0d, 16.0d, 16.0d, 16.0d)).reduce((v1, v2) -> {
        return Shapes.join(v1, v2, BooleanOp.OR);
    }).get();
    protected static final VoxelShape SHAPE_WALL_EAST = ModernLifeUtil.RotateVoxelShapeClockwise(SHAPE_WALL_NORTH);
    protected static final VoxelShape SHAPE_WALL_SOUTH = ModernLifeUtil.RotateVoxelShapeClockwise(SHAPE_WALL_EAST);
    protected static final VoxelShape SHAPE_WALL_WEST = ModernLifeUtil.RotateVoxelShapeClockwise(SHAPE_WALL_SOUTH);
    protected static final VoxelShape SHAPE_CEILING_NORTH = (VoxelShape) Stream.of(Block.box(0.0d, 15.0d, 0.0d, 16.0d, 16.0d, 16.0d)).reduce((v1, v2) -> {
        return Shapes.join(v1, v2, BooleanOp.OR);
    }).get();

    /* loaded from: outputsrg.jar:com/dairymoose/modernlife/blocks/GrateBlock$FluidType.class */
    public enum FluidType implements StringRepresentable {
        water,
        lava;

        public String getSerializedName() {
            return name().toLowerCase();
        }
    }

    public GrateBlock(Properties props) {
        super(props);
        this.allowAllLiquids = true;
        this.scheduler = Executors.newScheduledThreadPool(1);
        registerDefaultState((BlockState) ((BlockState) ((BlockState) ((BlockState) this.stateDefinition.any().setValue(AbstractPanelBlock.FACING, Direction.NORTH)).setValue(AbstractPanelBlock.FACE, AttachFace.FLOOR)).setValue(WATERLOGGED, false)).setValue(LEVEL, 0));
    }

    public ItemStack pickupBlock(LevelAccessor p_154560_, BlockPos p_154561_, BlockState p_154562_) {
        ItemStack fluid = pickupBlock(p_154560_, p_154561_, p_154562_);
        BlockState newState = p_154560_.getBlockState(p_154561_);
        if (!((Boolean) newState.getValue(WATERLOGGED)).booleanValue()) {
            ModernLifeCommon.LOGGER.debug("Set level to 0");
            p_154560_.setBlock(p_154561_, (BlockState) newState.setValue(LEVEL, 0), 3);
        }
        return fluid;
    }

    @OnlyIn(Dist.CLIENT)
    public void appendHoverText(ItemStack itemStack, @Nullable BlockGetter blockReader, List<Component> list, TooltipFlag tooltipFlag) {
        list.add(new TextComponent("Allows water and items to flow through freely"));
    }

    public boolean placeLiquid(LevelAccessor p_204509_1_, BlockPos p_204509_2_, BlockState p_204509_3_, FluidState p_204509_4_) {
        if ((p_204509_4_.getType() instanceof WaterFluid) || (p_204509_4_.getType() instanceof LavaFluid)) {
            if (p_204509_1_ instanceof ServerLevel) {
                ServerLevel world = (ServerLevel) p_204509_1_;
                FluidType f = FluidType.water;
                if (p_204509_4_.getType() instanceof WaterFluid) {
                    f = FluidType.water;
                } else if (p_204509_4_.getType() instanceof LavaFluid) {
                    f = FluidType.lava;
                }
                int newLevel = p_204509_4_.getAmount();
                ModernLifeCommon.LOGGER.debug("placeLiquid update: " + p_204509_4_);
                if (p_204509_4_.isSource()) {
                    world.setBlock(p_204509_2_, (BlockState) ((BlockState) ((BlockState) p_204509_3_.setValue(WATERLOGGED, true)).setValue(FLUIDTYPE, f)).setValue(LEVEL, Integer.valueOf(newLevel)), 3);
                    return true;
                }
                world.setBlock(p_204509_2_, (BlockState) ((BlockState) p_204509_3_.setValue(LEVEL, Integer.valueOf(newLevel))).setValue(FLUIDTYPE, f), 3);
                return true;
            }
            return true;
        }
        return false;
    }

    public boolean canPlaceLiquid(BlockGetter p_204510_1_, BlockPos p_204510_2_, BlockState p_204510_3_, Fluid p_204510_4_) {
        if (this.allowAllLiquids) {
            return true;
        }
        return canPlaceLiquid(p_204510_1_, p_204510_2_, p_204510_3_, p_204510_4_);
    }

    public BlockState updateShape(BlockState grate, Direction dir, BlockState updater, LevelAccessor world, BlockPos gratePos, BlockPos updaterPos) {
        ModernLifeCommon.LOGGER.debug("world = " + world);
        ModernLifeCommon.LOGGER.debug("updateShape, bs1: " + grate + " with pos = " + gratePos);
        ModernLifeCommon.LOGGER.debug("updateShape, bs2: " + updater + " with pos = " + updaterPos);
        ModernLifeCommon.LOGGER.debug("direction = " + dir);
        final BlockPos originalGratePos = gratePos.mutable();
        final GrateBlock grateBlock = this;
        this.scheduler.schedule(new Runnable() { // from class: com.dairymoose.modernlife.blocks.GrateBlock.1

            @Override // java.lang.Runnable
            public void run() {
                Method newLiquidMethod = null;
                try {
                    try {
                        int currentLevel = ((Integer) grate.getValue(GrateBlock.LEVEL)).intValue();
                        try {
                            newLiquidMethod = FlowingFluid.class.getDeclaredMethod(McpConstants.FLOWING_FLUID_getNewLiquid, LevelReader.class, BlockPos.class, BlockState.class);
                        } catch (NoSuchMethodException e) {
                        }
                        if (newLiquidMethod == null) {
                            newLiquidMethod = FlowingFluid.class.getDeclaredMethod("getNewLiquid", LevelReader.class, BlockPos.class, BlockState.class);
                        }
                        newLiquidMethod.setAccessible(true);
                        FluidState newFluid = (FluidState) newLiquidMethod.invoke(Fluids.FLOWING_WATER, world, originalGratePos, grate);
                        int newLevel = newFluid.getAmount();
                        if (newLevel < currentLevel) {
                            BlockState newGrateState = world.getBlockState(originalGratePos);
                            if (newGrateState.is(CustomBlocks.BLOCK_METAL_GRATE.get()) && !((Boolean) newGrateState.getValue(GrateBlock.WATERLOGGED)).booleanValue()) {
                                world.setBlock(originalGratePos, (BlockState) grate.setValue(GrateBlock.LEVEL, Integer.valueOf(newLevel)), 3);
                            }
                            ModernLifeCommon.LOGGER.debug("Set to new state: " + grate.setValue(GrateBlock.LEVEL, Integer.valueOf(newLevel)));
                        }
                        allowAllLiquids = true;
                    } catch (Throwable th) {
                        allowAllLiquids = true;
                        throw th;
                    }
                } catch (IllegalAccessException | IllegalArgumentException | NoSuchMethodException | SecurityException | InvocationTargetException e1) {
                    ModernLifeCommon.LOGGER.error("getNewLiquid error", e1);
                    allowAllLiquids = true;
                }
            }
        }, (int) (MS_PER_TICK * updater.getFluidState().getType().getTickDelay(world) * GRATE_SLOWDOWN_FACTOR), TimeUnit.MILLISECONDS);
        return grate;
    }


    public VoxelShape getCollisionShape(BlockState state, BlockGetter blockReader, BlockPos blockPos, CollisionContext ctx) {
        Entity collisionEntity = null;
        if (ctx instanceof EntityCollisionContext) {
            collisionEntity = ((EntityCollisionContext) ctx).getEntity() != null ? ((EntityCollisionContext) ctx).getEntity() : null;
        }
        if (ctx == CollisionContext.empty() || (collisionEntity != null && ((collisionEntity instanceof ItemEntity) || (collisionEntity instanceof ExperienceOrb)))) {
            return Shapes.empty();
        }
        return super.getCollisionShape(state, blockReader, blockPos, ctx);
    }

    @Override // com.dairymoose.modernlife.blocks.AbstractPanelBlock
    public BlockState getStateForPlacement(BlockPlaceContext context) {
        FluidType f = FluidType.water;
        Level world = context.getLevel();
        BlockPos pos = context.getClickedPos();
        BlockState oldState = world.getBlockState(pos);
        if (oldState.getFluidState().getType() instanceof WaterFluid) {
            f = FluidType.water;
        } else if (oldState.getFluidState().getType() instanceof LavaFluid) {
            f = FluidType.lava;
        }
        boolean waterlogged = false;
        if (!oldState.getFluidState().isEmpty() && oldState.getFluidState().isSource()) {
            waterlogged = true;
        }
        return (BlockState) ((BlockState) ((BlockState) super.getStateForPlacement(context).setValue(LEVEL, Integer.valueOf(oldState.getFluidState().getAmount()))).setValue(FLUIDTYPE, f)).setValue(WATERLOGGED, Boolean.valueOf(waterlogged));
    }

    @Deprecated
    public void onPlace(BlockState newState, Level world, BlockPos pos, BlockState oldState, boolean p_220082_5_) {
        ModernLifeCommon.LOGGER.debug("onPlace newState = " + newState + ", bool=" + p_220082_5_);
        if (!(oldState.getBlock() instanceof LiquidBlock) || !oldState.getFluidState().isEmpty()) {
        }
        int level = ((Integer) newState.getValue(LEVEL)).intValue();
        if (level >= 0) {
            this.scheduler.schedule(new Runnable() { // from class: com.dairymoose.modernlife.blocks.GrateBlock.2


                @Override // java.lang.Runnable
                public void run() {
                    FlowingFluid fluid = Fluids.WATER;
                    if (newState.getValue(GrateBlock.FLUIDTYPE) == FluidType.water) {
                        fluid = Fluids.WATER;
                    } else if (newState.getValue(GrateBlock.FLUIDTYPE) == FluidType.lava) {
                        fluid = Fluids.LAVA;
                    }
                    int level2 = ((Integer) newState.getValue(GrateBlock.LEVEL)).intValue();
                    Method m = null;
                    try {
                        try {
                            m = FlowingFluid.class.getDeclaredMethod(McpConstants.FLOWING_FLUID_spread, LevelAccessor.class, BlockPos.class, FluidState.class);
                        } catch (NoSuchMethodException e) {
                        }
                        if (m == null) {
                            m = FlowingFluid.class.getDeclaredMethod("spread", LevelAccessor.class, BlockPos.class, FluidState.class);
                        }
                        m.setAccessible(true);
                        Fluids.EMPTY.defaultFluidState();
                        if (level2 > 0 && (fluid instanceof FlowingFluid)) {
                            FluidState fs = fluid.getFlowing(level2, false);
                            m.invoke(fluid, world, pos, fs);
                        }
                    } catch (IllegalAccessException | IllegalArgumentException | NoSuchMethodException | SecurityException | InvocationTargetException e2) {
                        ModernLifeCommon.LOGGER.error("Fluid error", e2);
                    }
                    world.updateNeighborsAt(pos, newState.getBlock());
                }
            }, MS_PER_TICK * getFluidState(newState).getType().getTickDelay(world), TimeUnit.MILLISECONDS);
        } else {
            world.updateNeighborsAt(pos, newState.getBlock());
        }
    }



    @Deprecated
    public FluidState getFluidState(BlockState state) {
        if (((Boolean) state.getValue(WATERLOGGED)).booleanValue() && state.getValue(FLUIDTYPE) == FluidType.water) {
            return Fluids.WATER.getSource(false);
        }
        if (((Boolean) state.getValue(WATERLOGGED)).booleanValue() && state.getValue(FLUIDTYPE) == FluidType.lava) {
            return Fluids.LAVA.getSource(false);
        }
        if (((Integer) state.getValue(LEVEL)).intValue() > 0 && state.getValue(FLUIDTYPE) == FluidType.water) {
            return Fluids.WATER.getFlowing(((Integer) state.getValue(LEVEL)).intValue(), false);
        }
        if (((Integer) state.getValue(LEVEL)).intValue() > 0 && state.getValue(FLUIDTYPE) == FluidType.lava) {
            return Fluids.LAVA.getFlowing(((Integer) state.getValue(LEVEL)).intValue(), false);
        }
        return Fluids.EMPTY.defaultFluidState();
    }

    public void onRemove(BlockState oldState, Level p_196243_2_, BlockPos pos, BlockState newState, boolean p_196243_5_) {
        ModernLifeCommon.LOGGER.debug("Being changed to : " + newState);
        if (newState.is(Blocks.WATER) || newState.is(Blocks.AIR)) {
            ModernLifeCommon.LOGGER.debug("Respawn: " + oldState);
        }
        if (newState.is(Blocks.LAVA)) {
        }
    }

    protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
        builder.add(new Property[]{AbstractPanelBlock.FACING, AbstractPanelBlock.FACE, WATERLOGGED, LEVEL, FLUIDTYPE});
    }

    /* renamed from: com.dairymoose.modernlife.blocks.GrateBlock$3 */
    /* loaded from: outputsrg.jar:com/dairymoose/modernlife/blocks/GrateBlock$3.class */
    static /* synthetic */ class C00263 {
        static final /* synthetic */ int[] $SwitchMap$net$minecraft$core$Direction;

        /* renamed from: $SwitchMap$net$minecraft$world$level$block$state$properties$AttachFace */
        static final /* synthetic */ int[] f3x6a19ab39 = new int[AttachFace.values().length];

        static {
            try {
                f3x6a19ab39[AttachFace.FLOOR.ordinal()] = 1;
            } catch (NoSuchFieldError e) {
            }
            try {
                f3x6a19ab39[AttachFace.WALL.ordinal()] = 2;
            } catch (NoSuchFieldError e2) {
            }
            try {
                f3x6a19ab39[AttachFace.CEILING.ordinal()] = 3;
            } catch (NoSuchFieldError e3) {
            }
            $SwitchMap$net$minecraft$core$Direction = new int[Direction.values().length];
            try {
                $SwitchMap$net$minecraft$core$Direction[Direction.NORTH.ordinal()] = 1;
            } catch (NoSuchFieldError e4) {
            }
            try {
                $SwitchMap$net$minecraft$core$Direction[Direction.EAST.ordinal()] = 2;
            } catch (NoSuchFieldError e5) {
            }
            try {
                $SwitchMap$net$minecraft$core$Direction[Direction.WEST.ordinal()] = 3;
            } catch (NoSuchFieldError e6) {
            }
            try {
                $SwitchMap$net$minecraft$core$Direction[Direction.SOUTH.ordinal()] = 4;
            } catch (NoSuchFieldError e7) {
            }
        }
    }

    public VoxelShape getShape(BlockState bs, BlockGetter reader, BlockPos pos, CollisionContext sel) {
        switch (C00263.f3x6a19ab39[bs.getValue(AbstractPanelBlock.FACE).ordinal()]) {
            case 1:
                return SHAPE_FLOOR_NORTH;
            case 2:
                switch (C00263.$SwitchMap$net$minecraft$core$Direction[bs.getValue(AbstractPanelBlock.FACING).ordinal()]) {
                    case 1:
                        return SHAPE_WALL_NORTH;
                    case 2:
                        return SHAPE_WALL_EAST;
                    case 3:
                        return SHAPE_WALL_WEST;
                    case 4:
                        return SHAPE_WALL_SOUTH;
                }
            case 3:
                break;
            default:
                return SHAPE_FLOOR_NORTH;
        }
        return SHAPE_CEILING_NORTH;
    }
}
