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

package com.hypixel.hytale.server.core.universe.world.worldgen;

import javax.annotation.Nonnull;
import com.hypixel.hytale.server.core.universe.world.chunk.EntityChunk;
import com.hypixel.hytale.server.core.universe.world.chunk.BlockComponentChunk;
import com.hypixel.hytale.server.core.universe.world.chunk.BlockChunk;
import com.hypixel.hytale.server.core.universe.world.chunk.ChunkColumn;
import com.hypixel.hytale.server.core.universe.world.chunk.WorldChunk;
import com.hypixel.hytale.common.collection.Flags;
import com.hypixel.hytale.server.core.universe.world.chunk.ChunkFlag;
import com.hypixel.hytale.server.core.universe.world.World;
import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
import com.hypixel.hytale.component.Holder;

public class GeneratedChunk
{
    private final GeneratedBlockChunk generatedBlockChunk;
    private final GeneratedBlockStateChunk generatedBlockStateChunk;
    private final GeneratedEntityChunk generatedEntityChunk;
    private final Holder<ChunkStore>[] sections;
    
    public GeneratedChunk() {
        this(new GeneratedBlockChunk(), new GeneratedBlockStateChunk(), new GeneratedEntityChunk(), makeSections());
    }
    
    public GeneratedChunk(final GeneratedBlockChunk generatedBlockChunk, final GeneratedBlockStateChunk generatedBlockStateChunk, final GeneratedEntityChunk generatedEntityChunk, final Holder<ChunkStore>[] sections) {
        this.generatedBlockChunk = generatedBlockChunk;
        this.generatedBlockStateChunk = generatedBlockStateChunk;
        this.generatedEntityChunk = generatedEntityChunk;
        this.sections = sections;
    }
    
    public GeneratedBlockChunk getBlockChunk() {
        return this.generatedBlockChunk;
    }
    
    public GeneratedBlockStateChunk getBlockStateChunk() {
        return this.generatedBlockStateChunk;
    }
    
    public GeneratedEntityChunk getEntityChunk() {
        return this.generatedEntityChunk;
    }
    
    public Holder<ChunkStore>[] getSections() {
        return this.sections;
    }
    
    @Nonnull
    public Holder<ChunkStore> toWorldChunk(final World world) {
        final BlockChunk blockChunk = this.generatedBlockChunk.toBlockChunk(this.sections);
        final BlockComponentChunk blockComponentChunk = this.generatedBlockStateChunk.toBlockComponentChunk();
        final EntityChunk entityChunk = this.generatedEntityChunk.toEntityChunk();
        final WorldChunk worldChunk = new WorldChunk(world, new Flags<ChunkFlag>(ChunkFlag.NEWLY_GENERATED), blockChunk, blockComponentChunk, entityChunk);
        final Holder<ChunkStore> holder = worldChunk.toHolder();
        holder.putComponent(ChunkColumn.getComponentType(), new ChunkColumn(this.sections));
        return holder;
    }
    
    @Nonnull
    public Holder<ChunkStore> toHolder(final World world) {
        return this.toWorldChunk(world);
    }
    
    @Nonnull
    public static Holder<ChunkStore>[] makeSections() {
        final Holder<ChunkStore>[] holders = new Holder[10];
        for (int i = 0; i < holders.length; ++i) {
            holders[i] = ChunkStore.REGISTRY.newHolder();
        }
        return holders;
    }
}
