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

package com.hypixel.hytale.server.npc.util.expression;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.function.BooleanSupplier;
import java.util.function.DoubleSupplier;
import java.util.function.Supplier;

public interface Scope
{
    Supplier<String> getStringSupplier(final String p0);
    
    DoubleSupplier getNumberSupplier(final String p0);
    
    BooleanSupplier getBooleanSupplier(final String p0);
    
    Supplier<String[]> getStringArraySupplier(final String p0);
    
    Supplier<double[]> getNumberArraySupplier(final String p0);
    
    Supplier<boolean[]> getBooleanArraySupplier(final String p0);
    
    Function getFunction(final String p0);
    
    default String getString(final String name) {
        return this.getStringSupplier(name).get();
    }
    
    default double getNumber(final String name) {
        return this.getNumberSupplier(name).getAsDouble();
    }
    
    default boolean getBoolean(final String name) {
        return this.getBooleanSupplier(name).getAsBoolean();
    }
    
    default String[] getStringArray(final String name) {
        return this.getStringArraySupplier(name).get();
    }
    
    default double[] getNumberArray(final String name) {
        return this.getNumberArraySupplier(name).get();
    }
    
    default boolean[] getBooleanArray(final String name) {
        return this.getBooleanArraySupplier(name).get();
    }
    
    boolean isConstant(final String p0);
    
    @Nullable
    ValueType getType(final String p0);
    
    @Nonnull
    default String encodeFunctionName(@Nonnull final String name, @Nonnull final ValueType[] values) {
        final StringBuilder stringBuilder = new StringBuilder(name).append('@');
        for (int i = 0; i < values.length; ++i) {
            stringBuilder.append(encodeType(values[i]));
        }
        return stringBuilder.toString();
    }
    
    default char encodeType(@Nonnull final ValueType type) {
        return switch (type) {
            case NUMBER -> 'n';
            case STRING -> 's';
            case BOOLEAN -> 'b';
            case NUMBER_ARRAY -> 'N';
            case STRING_ARRAY -> 'S';
            case BOOLEAN_ARRAY -> 'B';
            default -> throw new IllegalStateException("Type cannot be encoded for function name: " + String.valueOf(type));
        };
    }
    
    @FunctionalInterface
    public interface Function
    {
        void call(final ExecutionContext p0, final int p1);
    }
}
