// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.builtin.hytalegenerator.newsystem.views;

import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
import com.hypixel.hytale.builtin.hytalegenerator.newsystem.bufferbundle.buffers.NEntityBuffer;
import com.hypixel.hytale.math.vector.Vector3i;
import com.hypixel.hytale.builtin.hytalegenerator.props.entity.EntityPlacementData;
import java.util.function.Consumer;
import com.hypixel.hytale.builtin.hytalegenerator.newsystem.GridUtils;
import javax.annotation.Nonnull;
import com.hypixel.hytale.builtin.hytalegenerator.bounds.Bounds3i;
import com.hypixel.hytale.builtin.hytalegenerator.newsystem.bufferbundle.NBufferBundle;

public class NEntityBufferView implements EntityContainer
{
    private final NBufferBundle.Access.View access;
    private final Bounds3i bounds_voxelGrid;
    private final Bounds3i bounds_bufferGrid;
    
    public NEntityBufferView(@Nonnull final NBufferBundle.Access.View bufferAccess) {
        this.access = bufferAccess;
        this.bounds_bufferGrid = bufferAccess.getBounds_bufferGrid();
        GridUtils.toVoxelGrid_fromBufferGrid(this.bounds_voxelGrid = bufferAccess.getBounds_bufferGrid());
    }
    
    public void forEach(@Nonnull final Consumer<EntityPlacementData> consumer) {
        final Vector3i position_bufferGrid = this.bounds_voxelGrid.min.clone();
        position_bufferGrid.setX(this.bounds_bufferGrid.min.x);
        while (position_bufferGrid.x < this.bounds_bufferGrid.max.x) {
            position_bufferGrid.setZ(this.bounds_bufferGrid.min.z);
            while (position_bufferGrid.z < this.bounds_bufferGrid.max.z) {
                position_bufferGrid.setY(this.bounds_bufferGrid.min.y);
                while (position_bufferGrid.y < this.bounds_bufferGrid.max.y) {
                    final NEntityBuffer buffer = this.getBuffer_fromBufferGrid(position_bufferGrid);
                    buffer.forEach(consumer);
                    position_bufferGrid.setY(position_bufferGrid.y + 1);
                }
                position_bufferGrid.setZ(position_bufferGrid.z + 1);
            }
            position_bufferGrid.setX(position_bufferGrid.x + 1);
        }
    }
    
    private NEntityBuffer getBuffer_fromBufferGrid(@Nonnull final Vector3i position_bufferGrid) {
        return (NEntityBuffer)this.access.getBuffer(position_bufferGrid).buffer();
    }
    
    public void copyFrom(@Nonnull final NEntityBufferView source) {
        assert source.bounds_voxelGrid.contains(this.bounds_voxelGrid);
        final Bounds3i thisBounds_bufferGrid = this.access.getBounds_bufferGrid();
        final Vector3i pos_bufferGrid = new Vector3i();
        pos_bufferGrid.setX(thisBounds_bufferGrid.min.x);
        while (pos_bufferGrid.x < thisBounds_bufferGrid.max.x) {
            pos_bufferGrid.setY(thisBounds_bufferGrid.min.y);
            while (pos_bufferGrid.y < thisBounds_bufferGrid.max.y) {
                pos_bufferGrid.setZ(thisBounds_bufferGrid.min.z);
                while (pos_bufferGrid.z < thisBounds_bufferGrid.max.z) {
                    final NEntityBuffer sourceBuffer = source.getBuffer_fromBufferGrid(pos_bufferGrid);
                    final NEntityBuffer destinationBuffer = this.getBuffer_fromBufferGrid(pos_bufferGrid);
                    destinationBuffer.copyFrom(sourceBuffer);
                    pos_bufferGrid.setZ(pos_bufferGrid.z + 1);
                }
                pos_bufferGrid.setY(pos_bufferGrid.y + 1);
            }
            pos_bufferGrid.setX(pos_bufferGrid.x + 1);
        }
    }
    
    @Override
    public void addEntity(@Nonnull final EntityPlacementData entityPlacementData) {
        final Vector3d entityPosition_voxelGrid = entityPlacementData.getOffset().toVector3d();
        final TransformComponent transform = entityPlacementData.getEntityHolder().getComponent(TransformComponent.getComponentType());
        assert transform != null;
        final Vector3d holderPosition_voxelGrid = transform.getPosition();
        entityPosition_voxelGrid.add(holderPosition_voxelGrid);
        final Vector3i position_bufferGrid = GridUtils.toIntegerGrid_fromDecimalGrid(entityPosition_voxelGrid);
        assert this.bounds_voxelGrid.contains(position_bufferGrid);
        GridUtils.toBufferGrid_fromVoxelGrid(position_bufferGrid);
        final NEntityBuffer buffer = (NEntityBuffer)this.access.getBuffer(position_bufferGrid).buffer();
        buffer.addEntity(entityPlacementData);
    }
    
    @Override
    public boolean isInsideBuffer(final int x, final int y, final int z) {
        return this.bounds_voxelGrid.contains(new Vector3i(x, y, z));
    }
}
