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

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

import java.util.function.Supplier;
import java.util.HashMap;
import java.util.Arrays;
import javax.annotation.Nonnull;
import java.util.Map;
import com.hypixel.hytale.server.npc.asset.builder.validators.Validator;
import javax.annotation.Nullable;

public class BuilderAttributeDescriptor
{
    private final String name;
    private final String type;
    private RequirementType required;
    private boolean computable;
    private final BuilderDescriptorState state;
    private final String shortDescription;
    private final String longDescription;
    @Nullable
    private String defaultValue;
    @Nullable
    private String domain;
    private int minSize;
    private int maxSize;
    @Nullable
    private Validator validator;
    @Nullable
    private Map<String, String> flagDescriptions;
    
    public BuilderAttributeDescriptor(final String name, final String type, final BuilderDescriptorState state, final String shortDescription, final String longDescription) {
        this.name = name;
        this.type = type;
        this.state = state;
        this.shortDescription = shortDescription;
        this.longDescription = longDescription;
        this.required = RequirementType.OPTIONAL;
        this.computable = false;
        this.defaultValue = null;
        this.domain = null;
        this.validator = null;
        this.flagDescriptions = null;
        this.minSize = -1;
        this.maxSize = -1;
    }
    
    @Nonnull
    public BuilderAttributeDescriptor required() {
        this.required = RequirementType.REQUIRED;
        this.defaultValue = null;
        return this;
    }
    
    @Nonnull
    public BuilderAttributeDescriptor requiredIfNotOverridden() {
        this.required = RequirementType.REQUIRED_IF_NOT_OVERRIDDEN;
        this.defaultValue = null;
        return this;
    }
    
    @Nonnull
    public BuilderAttributeDescriptor optional(final String defaultValue) {
        this.required = RequirementType.OPTIONAL;
        this.defaultValue = defaultValue;
        return this;
    }
    
    @Nonnull
    public BuilderAttributeDescriptor optional(final double[] defaultValue) {
        this.required = RequirementType.OPTIONAL;
        this.defaultValue = Arrays.toString(defaultValue);
        return this;
    }
    
    @Nonnull
    public BuilderAttributeDescriptor optional(final int[] defaultValue) {
        this.required = RequirementType.OPTIONAL;
        this.defaultValue = Arrays.toString(defaultValue);
        return this;
    }
    
    @Nonnull
    public BuilderAttributeDescriptor optional(final String[] defaultValue) {
        this.required = RequirementType.OPTIONAL;
        this.defaultValue = Arrays.toString(defaultValue);
        return this;
    }
    
    @Nonnull
    public BuilderAttributeDescriptor optional(final boolean[] defaultValue) {
        this.required = RequirementType.OPTIONAL;
        this.defaultValue = Arrays.toString(defaultValue);
        return this;
    }
    
    @Nonnull
    public BuilderAttributeDescriptor computable() {
        this.computable = true;
        return this;
    }
    
    @Nonnull
    public <E extends Enum<E>> BuilderAttributeDescriptor setBasicEnum(@Nonnull final Class<E> clazz) {
        final E[] enumConstants = clazz.getEnumConstants();
        this.domain = BuilderBase.getDomain(enumConstants);
        final HashMap<String, String> result = new HashMap<String, String>();
        for (final E E : enumConstants) {
            result.put(E.toString(), E.toString());
        }
        this.flagDescriptions = result;
        return this;
    }
    
    @Nonnull
    public <E extends Enum<E> & Supplier<String>> BuilderAttributeDescriptor setEnum(@Nonnull final Class<E> clazz) {
        final E[] enumConstants = clazz.getEnumConstants();
        this.domain = BuilderBase.getDomain(enumConstants);
        final HashMap<String, String> result = new HashMap<String, String>();
        for (final E E : enumConstants) {
            result.put(E.toString(), E.get());
        }
        this.flagDescriptions = result;
        return this;
    }
    
    @Nonnull
    public BuilderAttributeDescriptor domain(final String domain) {
        this.domain = domain;
        return this;
    }
    
    @Nonnull
    public BuilderAttributeDescriptor validator(final Validator validator) {
        this.validator = validator;
        return this;
    }
    
    @Nonnull
    public BuilderAttributeDescriptor length(final int size) {
        return this.length(size, size);
    }
    
    @Nonnull
    public BuilderAttributeDescriptor length(final int minSize, final int maxSize) {
        this.minSize = minSize;
        this.maxSize = maxSize;
        return this;
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "BuilderAttributeDescriptor{name='" + this.name + "', type='" + this.type + "', required=" + String.valueOf(this.required) + ", computable=" + this.computable + ", state=" + String.valueOf(this.state) + ", shortDescription='" + this.shortDescription + "', longDescription='" + this.longDescription + "', defaultValue='" + this.defaultValue + "', domain='" + this.domain + "', minSize=" + this.minSize + ", maxSize=" + this.maxSize + ", validator=" + String.valueOf(this.validator) + ", flagDescriptions=" + String.valueOf(this.flagDescriptions);
    }
    
    private enum RequirementType
    {
        REQUIRED, 
        OPTIONAL, 
        REQUIRED_IF_NOT_OVERRIDDEN;
    }
}
