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

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

import javax.annotation.Nonnull;
import javax.annotation.Nullable;

public class StateStringValidator extends StringValidator
{
    private String[] stateParts;
    private final boolean allowEmptyMain;
    private final boolean mainStateOnly;
    private final boolean allowNull;
    
    private StateStringValidator(final boolean allowEmptyMain, final boolean mainStateOnly, final boolean allowNull) {
        this.allowEmptyMain = allowEmptyMain;
        this.mainStateOnly = mainStateOnly;
        this.allowNull = allowNull;
    }
    
    @Override
    public boolean test(@Nullable final String value) {
        if (value == null) {
            return this.allowNull;
        }
        if (value.isEmpty()) {
            return false;
        }
        this.stateParts = value.split("\\.");
        if (this.stateParts.length > 2) {
            return false;
        }
        if (this.stateParts.length > 1 && this.mainStateOnly) {
            return false;
        }
        if (this.stateParts.length > 1 && this.allowEmptyMain) {
            final String statePart = this.stateParts[1];
            return statePart != null && !statePart.isEmpty();
        }
        return this.stateParts.length != 0 && this.stateParts[0] != null && !this.stateParts[0].isEmpty();
    }
    
    @Nonnull
    @Override
    public String errorMessage(final String value) {
        return String.format("%s is not a valid format for a state string. May only contain one . separator and must not be empty.%s%s", value, this.allowEmptyMain ? "" : " Main state must not be empty.", this.mainStateOnly ? " Sub state must not be set." : "");
    }
    
    @Nonnull
    @Override
    public String errorMessage(final String value, final String name) {
        return String.format("Parameter %s, %s is not a valid format for a state string. May only contain one . separator and must not be empty.%s%s", name, value, this.allowEmptyMain ? "" : " Main state must not be empty.", this.mainStateOnly ? " Sub state must not be set." : "");
    }
    
    public boolean hasMainState() {
        if (this.stateParts.length <= 0) {
            return false;
        }
        final String statePart = this.stateParts[0];
        return statePart != null && !statePart.isEmpty();
    }
    
    public boolean hasSubState() {
        return this.stateParts.length > 1 && this.stateParts[1] != null && !this.stateParts[1].isEmpty();
    }
    
    public String getMainState() {
        return this.stateParts[0];
    }
    
    public String getSubState() {
        return this.stateParts[1];
    }
    
    @Nonnull
    public static StateStringValidator get() {
        return new StateStringValidator(true, false, false);
    }
    
    @Nonnull
    public static StateStringValidator mainStateOnly() {
        return new StateStringValidator(false, true, false);
    }
    
    @Nonnull
    public static StateStringValidator requireMainState() {
        return new StateStringValidator(false, false, false);
    }
    
    @Nonnull
    public static StateStringValidator requireMainStateOrNull() {
        return new StateStringValidator(false, false, true);
    }
}
