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

package com.hypixel.hytale.server.core.modules.entitystats.asset.condition;

import com.hypixel.hytale.codec.KeyedCodec;
import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
import com.hypixel.hytale.codec.Codec;
import com.hypixel.hytale.component.Store;
import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
import com.hypixel.hytale.server.core.universe.world.World;
import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.server.core.universe.world.chunk.BlockChunk;
import com.hypixel.hytale.math.util.ChunkUtil;
import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
import java.time.Instant;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.ComponentAccessor;
import com.hypixel.hytale.server.core.asset.type.environment.config.Environment;
import java.util.Arrays;
import javax.annotation.Nullable;
import javax.annotation.Nonnull;
import com.hypixel.hytale.codec.builder.BuilderCodec;

public class EnvironmentCondition extends Condition
{
    @Nonnull
    public static final BuilderCodec<EnvironmentCondition> CODEC;
    protected String[] unknownEnvironments;
    @Nullable
    protected int[] environments;
    
    protected EnvironmentCondition() {
    }
    
    public int[] getEnvironments() {
        if (this.environments == null && this.unknownEnvironments != null) {
            this.environments = Arrays.stream(this.unknownEnvironments).mapToInt(environment -> Environment.getAssetMap().getIndex(environment)).sorted().toArray();
        }
        return this.environments;
    }
    
    @Override
    public boolean eval0(@Nonnull final ComponentAccessor<EntityStore> componentAccessor, @Nonnull final Ref<EntityStore> ref, @Nonnull final Instant currentTime) {
        final TransformComponent transformComponent = componentAccessor.getComponent(ref, TransformComponent.getComponentType());
        assert transformComponent != null;
        final Vector3d position = transformComponent.getPosition();
        final World world = componentAccessor.getExternalData().getWorld();
        final ChunkStore chunkStore = world.getChunkStore();
        final long chunkIndex = ChunkUtil.indexChunkFromBlock(position.getX(), position.getZ());
        final Ref<ChunkStore> chunkRef = chunkStore.getChunkReference(chunkIndex);
        if (chunkRef == null || !chunkRef.isValid()) {
            return false;
        }
        final Store<ChunkStore> chunkComponentStore = chunkStore.getStore();
        final BlockChunk blockChunkComponent = chunkComponentStore.getComponent(chunkRef, BlockChunk.getComponentType());
        assert blockChunkComponent != null;
        final int environmentId = blockChunkComponent.getEnvironment(position);
        return Arrays.binarySearch(this.getEnvironments(), environmentId) >= 0;
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "EnvironmentCondition{unknownEnvironments=" + Arrays.toString(this.unknownEnvironments) + ", environments=" + Arrays.toString(this.environments) + "} " + super.toString();
    }
    
    static {
        CODEC = BuilderCodec.builder(EnvironmentCondition.class, EnvironmentCondition::new, Condition.BASE_CODEC).append(new KeyedCodec<String[]>("Environments", new ArrayCodec<String>(Codec.STRING, String[]::new)), (condition, value) -> condition.unknownEnvironments = value, condition -> condition.unknownEnvironments).documentation("The environments to evaluate the condition against.").add().afterDecode(condition -> condition.environments = null).build();
    }
}
