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

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

import com.hypixel.hytale.server.npc.asset.builder.expression.BuilderExpression;
import com.hypixel.hytale.server.npc.asset.builder.expression.BuilderExpressionStaticBooleanArray;
import com.hypixel.hytale.server.npc.asset.builder.expression.BuilderExpressionStaticStringArray;
import com.hypixel.hytale.server.npc.asset.builder.expression.BuilderExpressionStaticNumberArray;
import com.hypixel.hytale.server.npc.asset.builder.BuilderParameters;
import javax.annotation.Nonnull;
import com.google.gson.JsonElement;
import com.hypixel.hytale.server.npc.util.expression.ValueType;

public abstract class ArrayHolder extends ValueHolder
{
    protected int minLength;
    protected int maxLength;
    
    public ArrayHolder(final ValueType valueType) {
        super(valueType);
        this.maxLength = Integer.MAX_VALUE;
    }
    
    protected void readJSON(@Nonnull final JsonElement requiredJsonElement, final int minLength, final int maxLength, final String name, @Nonnull final BuilderParameters builderParameters) {
        this.setLength(minLength, maxLength);
        this.readJSON(requiredJsonElement, name, builderParameters);
    }
    
    protected void readJSON(final JsonElement optionalJsonElement, final int minLength, final int maxLength, final double[] defaultValue, final String name, @Nonnull final BuilderParameters builderParameters) {
        this.setLength(minLength, maxLength);
        this.readJSON(optionalJsonElement, () -> new BuilderExpressionStaticNumberArray(defaultValue), name, builderParameters);
    }
    
    protected void readJSON(final JsonElement optionalJsonElement, final int minLength, final int maxLength, final String[] defaultValue, final String name, @Nonnull final BuilderParameters builderParameters) {
        this.setLength(minLength, maxLength);
        this.readJSON(optionalJsonElement, () -> new BuilderExpressionStaticStringArray(defaultValue), name, builderParameters);
    }
    
    protected void readJSON(final JsonElement optionalJsonElement, final int minLength, final int maxLength, final boolean[] defaultValue, final String name, @Nonnull final BuilderParameters builderParameters) {
        this.setLength(minLength, maxLength);
        this.readJSON(optionalJsonElement, () -> new BuilderExpressionStaticBooleanArray(defaultValue), name, builderParameters);
    }
    
    protected void validateLength(final int length) {
        if (length < this.minLength || length > this.maxLength) {
            final StringBuilder errorString = new StringBuilder(100);
            errorString.append(this.name).append(": Invalid array size in array holder (Should be ");
            if (this.minLength == this.maxLength) {
                errorString.append(this.minLength);
            }
            else if (this.maxLength < Integer.MAX_VALUE) {
                errorString.append("between ").append(this.minLength).append(" and ").append(this.maxLength);
            }
            else {
                errorString.append("a minimum length of ").append(this.minLength);
            }
            errorString.append(" but is ").append(length).append(')');
            throw new IllegalStateException(errorString.toString());
        }
    }
    
    protected void setLength(final int minLength, final int maxLength) {
        if (minLength > maxLength) {
            throw new IllegalArgumentException("Illegal length for array in array holder specified");
        }
        if (minLength < 0) {
            throw new IllegalArgumentException("Illegal minimum length for array in array holder specified");
        }
        this.minLength = minLength;
        this.maxLength = maxLength;
    }
    
    protected void setLength(final int length) {
        this.setLength(length, length);
    }
}
