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

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

import com.hypixel.hytale.server.npc.util.expression.ExecutionContext;
import com.hypixel.hytale.server.npc.asset.builder.BuilderParameters;
import javax.annotation.Nonnull;
import com.google.gson.JsonElement;
import java.time.format.DateTimeParseException;
import java.time.Duration;
import java.time.Period;
import javax.annotation.Nullable;
import java.time.temporal.TemporalAmount;
import com.hypixel.hytale.server.npc.asset.builder.validators.TemporalArrayValidator;

public class TemporalArrayHolder extends StringArrayHolder
{
    protected TemporalArrayValidator validator;
    private TemporalAmount[] cachedTemporalArray;
    
    public static TemporalAmount[] convertStringToTemporalArray(@Nullable final String[] source) {
        if (source == null) {
            return null;
        }
        final int length = source.length;
        final TemporalAmount[] result = new TemporalAmount[length];
        for (int i = 0; i < length; ++i) {
            final String text = source[i];
            final String period = (!source[i].isEmpty() && source[i].charAt(0) == 'P') ? text : ("P" + text);
            try {
                result[i] = Period.parse(period);
            }
            catch (final DateTimeParseException e) {
                try {
                    result[i] = Duration.parse(period);
                }
                catch (final DateTimeParseException e2) {
                    throw new IllegalStateException(String.format("Cannot parse text %s to Duration or Period", source[i]));
                }
            }
        }
        return result;
    }
    
    public void readJSON(@Nonnull final JsonElement requiredJsonElement, final int minLength, final int maxLength, final TemporalArrayValidator validator, final String name, @Nonnull final BuilderParameters builderParameters) {
        this.readJSON(requiredJsonElement, minLength, maxLength, name, builderParameters);
        this.validator = validator;
        if (this.isStatic()) {
            final String[] array = this.expression.getStringArray(null);
            this.validate(this.cachedTemporalArray = convertStringToTemporalArray(array));
        }
    }
    
    @Nullable
    public TemporalAmount[] getTemporalArray(final ExecutionContext executionContext) {
        final TemporalAmount[] value = this.rawGetTemporalArray(executionContext);
        return value;
    }
    
    @Nullable
    public TemporalAmount[] rawGetTemporalArray(final ExecutionContext executionContext) {
        if (this.isStatic()) {
            return this.cachedTemporalArray;
        }
        final String[] array = this.expression.getStringArray(executionContext);
        final TemporalAmount[] value = convertStringToTemporalArray(array);
        this.validate(value);
        return value;
    }
    
    public void validate(@Nullable final TemporalAmount[] value) {
        if (value != null) {
            this.validateLength(value.length);
        }
        if (this.validator != null && !this.validator.test(value)) {
            throw new IllegalStateException(this.validator.errorMessage(this.name, value));
        }
    }
}
