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

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

import java.time.Period;
import java.time.Duration;
import java.time.ZoneId;
import java.time.LocalDateTime;
import com.hypixel.hytale.server.core.modules.time.WorldTimeResource;
import java.time.Instant;
import com.hypixel.hytale.server.npc.asset.builder.validators.TemporalArrayValidator;
import com.hypixel.hytale.server.npc.asset.builder.validators.TemporalSequenceValidator;
import com.hypixel.hytale.server.npc.asset.builder.Builder;
import com.google.gson.JsonElement;
import com.hypixel.hytale.server.npc.asset.builder.BuilderDescriptorState;
import com.hypixel.hytale.server.npc.corecomponents.lifecycle.SensorAge;
import com.hypixel.hytale.server.npc.instructions.Sensor;
import com.hypixel.hytale.server.npc.asset.builder.BuilderSupport;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.npc.asset.builder.holder.TemporalArrayHolder;
import java.time.temporal.TemporalAmount;
import com.hypixel.hytale.server.npc.corecomponents.builders.BuilderSensorBase;

public class BuilderSensorAge extends BuilderSensorBase
{
    public static final TemporalAmount MIN_TIME;
    public static final TemporalAmount MAX_TIME;
    protected final TemporalArrayHolder ageRange;
    
    public BuilderSensorAge() {
        this.ageRange = new TemporalArrayHolder();
    }
    
    @Nonnull
    @Override
    public String getShortDescription() {
        return "Triggers when the age of the NPC falls between a certain range";
    }
    
    @Nonnull
    @Override
    public String getLongDescription() {
        return "Triggers when the age of the NPC falls between a certain range. Range is defined in terms of period (e.g. 1Y2M3W4D - 1 year, 2 months, 3 weeks, 4 days) or duration (e.g. 2DT3H4M - 2 days, 3 hours, 4 minutes)";
    }
    
    @Nonnull
    @Override
    public Sensor build(@Nonnull final BuilderSupport builderSupport) {
        return new SensorAge(this, builderSupport);
    }
    
    @Nonnull
    @Override
    public BuilderDescriptorState getBuilderDescriptorState() {
        return BuilderDescriptorState.Stable;
    }
    
    @Nonnull
    @Override
    public Builder<Sensor> readConfig(@Nonnull final JsonElement data) {
        this.requireTemporalRange(data, "AgeRange", this.ageRange, TemporalSequenceValidator.betweenMonotonic(BuilderSensorAge.MIN_TIME, BuilderSensorAge.MAX_TIME), BuilderDescriptorState.Stable, "The age range within which to trigger", null);
        return this;
    }
    
    @Nonnull
    public Instant[] getAgeRange(@Nonnull final BuilderSupport support) {
        final Instant spawnInstant = support.getEntity().getSpawnInstant();
        final LocalDateTime spawnTime = LocalDateTime.ofInstant(spawnInstant, WorldTimeResource.ZONE_OFFSET);
        final TemporalAmount[] range = this.ageRange.getTemporalArray(support.getExecutionContext());
        final Instant[] ageInstants = new Instant[range.length];
        ageInstants[0] = spawnTime.plus(range[0]).toInstant(WorldTimeResource.ZONE_OFFSET);
        ageInstants[1] = spawnTime.plus(range[1]).toInstant(WorldTimeResource.ZONE_OFFSET);
        return ageInstants;
    }
    
    static {
        MIN_TIME = Duration.ZERO;
        MAX_TIME = Period.ofDays(Integer.MAX_VALUE);
    }
}
