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

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

import java.util.Arrays;
import javax.annotation.Nonnull;
import java.util.Iterator;
import com.hypixel.hytale.server.core.modules.entity.component.HeadRotation;
import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
import com.hypixel.hytale.server.core.modules.entity.component.FromWorldGen;
import com.hypixel.hytale.server.core.universe.world.chunk.EntityChunk;
import javax.annotation.Nullable;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.Holder;
import com.hypixel.hytale.server.core.prefab.PrefabRotation;
import com.hypixel.hytale.math.vector.Vector3i;
import java.util.function.Consumer;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import java.util.List;

public class GeneratedEntityChunk
{
    private final List<EntityWrapperEntry> entities;
    
    public GeneratedEntityChunk() {
        this(new ObjectArrayList<EntityWrapperEntry>());
    }
    
    protected GeneratedEntityChunk(final List<EntityWrapperEntry> entities) {
        this.entities = entities;
    }
    
    public List<EntityWrapperEntry> getEntities() {
        return this.entities;
    }
    
    public void forEachEntity(final Consumer<EntityWrapperEntry> consumer) {
        this.entities.forEach(consumer);
    }
    
    public void addEntities(final Vector3i offset, final PrefabRotation rotation, @Nullable final Holder<EntityStore>[] entityHolders, final int objectId) {
        if (entityHolders != null && entityHolders.length > 0) {
            this.entities.add(new EntityWrapperEntry(offset, rotation, entityHolders, objectId));
        }
    }
    
    @Nonnull
    public EntityChunk toEntityChunk() {
        final EntityChunk entityChunk = new EntityChunk();
        for (final EntityWrapperEntry entry : this.entities) {
            final FromWorldGen fromWorldGen = new FromWorldGen(entry.worldgenId());
            for (final Holder<EntityStore> entityHolder : entry.entityHolders()) {
                final TransformComponent transformComponent = entityHolder.getComponent(TransformComponent.getComponentType());
                assert transformComponent != null;
                entry.rotation().rotate(transformComponent.getPosition().subtract(0.5, 0.0, 0.5));
                transformComponent.getPosition().add(0.5, 0.0, 0.5);
                final HeadRotation headRotationComponent = entityHolder.getComponent(HeadRotation.getComponentType());
                if (headRotationComponent != null) {
                    headRotationComponent.getRotation().addYaw(-entry.rotation().getYaw());
                }
                transformComponent.getRotation().addYaw(-entry.rotation().getYaw());
                transformComponent.getPosition().add(entry.offset());
                entityHolder.putComponent(FromWorldGen.getComponentType(), fromWorldGen);
                entityChunk.storeEntityHolder(entityHolder);
            }
        }
        return entityChunk;
    }
    
    record EntityWrapperEntry(Vector3i offset, PrefabRotation rotation, Holder<EntityStore>[] entityHolders, int worldgenId) {
        @Nonnull
        @Override
        public String toString() {
            return "EntityWrapperEntry{offset=" + String.valueOf(this.offset) + ", rotation=" + String.valueOf(this.rotation) + ", entityHolders=" + Arrays.toString(this.entityHolders);
        }
    }
}
