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

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

import java.util.Map;
import com.hypixel.hytale.codec.schema.config.BooleanSchema;
import com.hypixel.hytale.codec.schema.config.StringSchema;
import com.hypixel.hytale.codec.schema.config.ObjectSchema;
import com.hypixel.hytale.codec.schema.config.Schema;
import com.hypixel.hytale.codec.schema.SchemaContext;
import com.hypixel.hytale.server.npc.instructions.Motion;
import com.hypixel.hytale.server.npc.instructions.Action;
import java.util.List;
import com.hypixel.hytale.server.npc.util.expression.Scope;
import com.hypixel.hytale.server.npc.validators.NPCLoadTimeValidationHelper;
import com.google.gson.JsonElement;
import com.hypixel.hytale.server.npc.util.expression.ExecutionContext;
import javax.annotation.Nullable;
import javax.annotation.Nonnull;

public class BuilderComponent<T> extends BuilderBase<T>
{
    private final Class<T> classType;
    @Nonnull
    private final BuilderObjectReferenceHelper<T> content;
    
    public BuilderComponent(final Class<T> classType) {
        this.classType = classType;
        this.content = new BuilderObjectReferenceHelper<T>(classType, null);
    }
    
    @Nullable
    @Override
    public String getShortDescription() {
        return null;
    }
    
    @Nullable
    @Override
    public String getLongDescription() {
        return null;
    }
    
    @Override
    public T build(@Nonnull final BuilderSupport builderSupport) {
        return this.content.build(builderSupport);
    }
    
    @Override
    public Class<T> category() {
        return this.classType;
    }
    
    @Nullable
    @Override
    public BuilderDescriptorState getBuilderDescriptorState() {
        return null;
    }
    
    @Override
    public boolean isEnabled(final ExecutionContext context) {
        return true;
    }
    
    @Nonnull
    @Override
    public Builder<T> readConfig(@Nonnull final JsonElement data) {
        this.requireObject(data, "Content", this.content, null, null, null, this.validationHelper);
        return this;
    }
    
    @Override
    public boolean validate(final String configName, @Nonnull final NPCLoadTimeValidationHelper validationHelper, @Nonnull final ExecutionContext context, final Scope globalScope, @Nonnull final List<String> errors) {
        return super.validate(configName, validationHelper, context, globalScope, errors) & this.content.validate(configName, validationHelper, this.builderManager, context, globalScope, errors);
    }
    
    @Override
    public boolean canRequireFeature() {
        return this.classType.isAssignableFrom(Action.class) || this.classType.isAssignableFrom(Motion.class);
    }
    
    @Nonnull
    @Override
    public Schema toSchema(@Nonnull final SchemaContext context) {
        final ObjectSchema s = (ObjectSchema)super.toSchema(context);
        final Map<String, Schema> props = s.getProperties();
        props.put("Class", new StringSchema());
        props.put("Interface", new StringSchema());
        props.put("Default", new StringSchema());
        props.put("DefaultState", new StringSchema());
        props.put("ResetOnStateChange", new BooleanSchema());
        return s;
    }
}
