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

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

import java.util.function.IntPredicate;
import com.hypixel.hytale.server.npc.asset.builder.BuilderObjectHelper;
import java.util.Objects;
import javax.annotation.Nonnull;

public class OneOrNonePresentValidator extends Validator
{
    @Nonnull
    private final String[] attributes;
    
    private OneOrNonePresentValidator(final String... attributes) {
        this.attributes = Objects.requireNonNull(attributes, "Attributes in OneOrNonePresentValidator must not be null");
    }
    
    public static boolean test(@Nonnull final BuilderObjectHelper<?>[] objects) {
        return OnePresentValidator.countPresent(objects.length, i -> objects[i].isPresent()) <= 1;
    }
    
    public static boolean test(@Nonnull final boolean[] readStatus) {
        return OnePresentValidator.countPresent(readStatus.length, i -> readStatus[i]) <= 1;
    }
    
    public static boolean test(@Nonnull final BuilderObjectHelper<?> objectHelper1, @Nonnull final BuilderObjectHelper<?> objectHelper2) {
        return OnePresentValidator.countPresent(objectHelper1, objectHelper2) <= 1;
    }
    
    public static boolean test(@Nonnull final BuilderObjectHelper<?> objectHelper1, @Nonnull final BuilderObjectHelper<?> objectHelper2, @Nonnull final BuilderObjectHelper<?> objectHelper3) {
        return OnePresentValidator.countPresent(objectHelper1, objectHelper2, objectHelper3) <= 1;
    }
    
    @Nonnull
    public static String errorMessage(@Nonnull final String[] attributes, final BuilderObjectHelper<?>[] objectHelpers) {
        return errorMessage(attributes, i -> objectHelpers[i].isPresent());
    }
    
    @Nonnull
    public static String errorMessage(@Nonnull final String[] attributes, final boolean[] readStatus) {
        return errorMessage(attributes, i -> readStatus[i]);
    }
    
    @Nonnull
    public static String errorMessage(@Nonnull final String[] attributes, @Nonnull final IntPredicate presentPredicate) {
        final StringBuilder result = new StringBuilder("Exactly one or none of ");
        String sep = ", ";
        for (int i = 0; i < attributes.length; ++i) {
            if (i == attributes.length - 1) {
                sep = "";
            }
            result.append(String.format("'%s'%s%s", attributes[i], presentPredicate.test(i) ? "(Present)" : "", sep));
        }
        return String.valueOf(result) + " must be present";
    }
    
    @Nonnull
    public static OneOrNonePresentValidator withAttributes(final String... attributes) {
        return new OneOrNonePresentValidator(attributes);
    }
}
