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

package com.hypixel.hytale.server.npc.asset.builder.expression;

import com.hypixel.hytale.common.util.ArrayUtil;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonElement;
import com.google.gson.JsonArray;
import com.hypixel.hytale.server.npc.util.expression.StdScope;
import com.hypixel.hytale.server.npc.util.expression.ExecutionContext;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.npc.util.expression.ValueType;
import javax.annotation.Nullable;

public class BuilderExpressionStaticNumberArray extends BuilderExpression
{
    public static final BuilderExpressionStaticNumberArray INSTANCE_EMPTY;
    private final double[] numberArray;
    @Nullable
    private int[] cachedIntArray;
    
    public BuilderExpressionStaticNumberArray(final double[] array) {
        this.numberArray = array;
        this.cachedIntArray = null;
    }
    
    @Nonnull
    @Override
    public ValueType getType() {
        return ValueType.NUMBER_ARRAY;
    }
    
    @Override
    public boolean isStatic() {
        return true;
    }
    
    @Override
    public double[] getNumberArray(final ExecutionContext executionContext) {
        return this.numberArray;
    }
    
    @Override
    public int[] getIntegerArray(final ExecutionContext executionContext) {
        this.createCacheIfAbsent();
        return this.cachedIntArray;
    }
    
    @Override
    public void addToScope(final String name, @Nonnull final StdScope scope) {
        scope.addVar(name, this.numberArray);
    }
    
    @Override
    public void updateScope(@Nonnull final StdScope scope, final String name, final ExecutionContext executionContext) {
        scope.changeValue(name, this.numberArray);
    }
    
    private void createCacheIfAbsent() {
        if (this.cachedIntArray == null) {
            this.cachedIntArray = convertDoubleToIntArray(this.numberArray);
        }
    }
    
    @Nullable
    public static BuilderExpressionStaticNumberArray fromJSON(@Nonnull final JsonArray jsonArray) {
        final int size = jsonArray.size();
        final double[] array = new double[size];
        for (int i = 0; i < size; ++i) {
            final JsonElement element = jsonArray.get(i);
            if (!element.isJsonPrimitive()) {
                return null;
            }
            final JsonPrimitive primitive = element.getAsJsonPrimitive();
            if (!primitive.isNumber()) {
                return null;
            }
            array[i] = primitive.getAsDouble();
        }
        return new BuilderExpressionStaticNumberArray(array);
    }
    
    public static int[] convertDoubleToIntArray(@Nullable final double[] source) {
        if (source == null) {
            return null;
        }
        final int length = source.length;
        final int[] result = new int[length];
        for (int i = 0; i < length; ++i) {
            result[i] = (int)Math.round(source[i]);
        }
        return result;
    }
    
    public static double[] convertIntToDoubleArray(@Nullable final int[] source) {
        if (source == null) {
            return null;
        }
        final int length = source.length;
        final double[] result = new double[length];
        for (int i = 0; i < length; ++i) {
            result[i] = source[i];
        }
        return result;
    }
    
    static {
        INSTANCE_EMPTY = new BuilderExpressionStaticNumberArray(ArrayUtil.EMPTY_DOUBLE_ARRAY);
    }
}
