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

package com.hypixel.hytale.server.npc.corecomponents.world.builders;

import com.hypixel.hytale.server.npc.asset.builder.Builder;
import com.hypixel.hytale.server.npc.asset.builder.validators.DoubleValidator;
import com.hypixel.hytale.server.npc.asset.builder.validators.DoubleRangeValidator;
import com.hypixel.hytale.server.npc.asset.builder.validators.IntSingleValidator;
import com.hypixel.hytale.server.npc.asset.builder.validators.DoubleArrayValidator;
import com.hypixel.hytale.server.npc.asset.builder.validators.DoubleSequenceValidator;
import com.google.gson.JsonElement;
import com.hypixel.hytale.server.npc.asset.builder.BuilderDescriptorState;
import com.hypixel.hytale.server.npc.corecomponents.world.HeadMotionObserve;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.npc.asset.builder.BuilderSupport;
import com.hypixel.hytale.server.npc.asset.builder.holder.DoubleHolder;
import com.hypixel.hytale.server.npc.asset.builder.holder.IntHolder;
import com.hypixel.hytale.server.npc.asset.builder.holder.BooleanHolder;
import com.hypixel.hytale.server.npc.asset.builder.holder.NumberArrayHolder;
import com.hypixel.hytale.server.npc.corecomponents.builders.BuilderHeadMotionBase;

public class BuilderHeadMotionObserve extends BuilderHeadMotionBase
{
    protected static final double[] DEFAULT_PAUSE_TIME_RANGE;
    protected final NumberArrayHolder angleRange;
    protected final NumberArrayHolder pauseTimeRange;
    protected final BooleanHolder pickRandomAngle;
    protected final IntHolder viewSegments;
    protected final DoubleHolder relativeTurnSpeed;
    
    public BuilderHeadMotionObserve() {
        this.angleRange = new NumberArrayHolder();
        this.pauseTimeRange = new NumberArrayHolder();
        this.pickRandomAngle = new BooleanHolder();
        this.viewSegments = new IntHolder();
        this.relativeTurnSpeed = new DoubleHolder();
    }
    
    @Nonnull
    @Override
    public HeadMotionObserve build(@Nonnull final BuilderSupport builderSupport) {
        return new HeadMotionObserve(this, builderSupport);
    }
    
    @Nonnull
    @Override
    public String getShortDescription() {
        return "Observe surroundings in various ways.";
    }
    
    @Nonnull
    @Override
    public String getLongDescription() {
        return "Observe surroundings in various ways. This includes looking in random directions within an angle, or sweeping the head left and right, etc. Angles are relative to body angle at any given time.";
    }
    
    @Nonnull
    @Override
    public BuilderDescriptorState getBuilderDescriptorState() {
        return BuilderDescriptorState.Stable;
    }
    
    @Nonnull
    @Override
    public BuilderHeadMotionObserve readConfig(@Nonnull final JsonElement data) {
        this.requireDoubleRange(data, "AngleRange", this.angleRange, DoubleSequenceValidator.betweenWeaklyMonotonic(-180.0, 180.0), BuilderDescriptorState.Stable, "The angle range to observe in degrees", "The angle range to observe in degrees, offset from facing forwards");
        this.getDoubleRange(data, "PauseTimeRange", this.pauseTimeRange, BuilderHeadMotionObserve.DEFAULT_PAUSE_TIME_RANGE, DoubleSequenceValidator.betweenWeaklyMonotonic(0.0, Double.MAX_VALUE), BuilderDescriptorState.Stable, "How long to continue looking in a given direction", null);
        this.getBoolean(data, "PickRandomAngle", this.pickRandomAngle, false, BuilderDescriptorState.Stable, "Whether to pick random angles within the range", "Whether to pick random angles within the range. If false, will instead sweep across the range, pausing at either end.");
        this.getInt(data, "ViewSegments", this.viewSegments, 1, IntSingleValidator.greater0(), BuilderDescriptorState.Stable, "The number of distinct segments to stop at when sweeping from left to right", null);
        this.getDouble(data, "RelativeTurnSpeed", this.relativeTurnSpeed, 1.0, DoubleRangeValidator.fromExclToIncl(0.0, 2.0), BuilderDescriptorState.Stable, "The relative turn speed modifier", null);
        return this;
    }
    
    public float[] getAngleRange(@Nonnull final BuilderSupport support) {
        final double[] range = this.angleRange.get(support.getExecutionContext());
        final float[] floatRange = { (float)(range[0] * 0.01745329238474369), (float)(range[1] * 0.01745329238474369) };
        return floatRange;
    }
    
    public double[] getPauseTimeRange(@Nonnull final BuilderSupport support) {
        return this.pauseTimeRange.get(support.getExecutionContext());
    }
    
    public boolean isPickRandomAngle(@Nonnull final BuilderSupport support) {
        return this.pickRandomAngle.get(support.getExecutionContext());
    }
    
    public int getViewSegments(@Nonnull final BuilderSupport support) {
        return this.viewSegments.get(support.getExecutionContext());
    }
    
    public double getRelativeTurnSpeed(@Nonnull final BuilderSupport support) {
        return this.relativeTurnSpeed.get(support.getExecutionContext());
    }
    
    static {
        DEFAULT_PAUSE_TIME_RANGE = new double[] { 2.0, 2.0 };
    }
}
