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

package com.hypixel.hytale.codec.validation.validator;

import java.util.Arrays;
import com.hypixel.hytale.codec.builder.BuilderCodec;
import com.hypixel.hytale.codec.schema.config.Schema;
import com.hypixel.hytale.codec.schema.SchemaContext;
import it.unimi.dsi.fastutil.objects.ObjectListIterator;
import java.util.Collection;
import java.util.List;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import javax.annotation.Nonnull;
import com.hypixel.hytale.codec.validation.ValidationResults;
import com.hypixel.hytale.codec.validation.Validator;

public class OrValidator<T> implements Validator<T>
{
    private final Validator<T>[] validators;
    
    public OrValidator(final Validator<T>[] validators) {
        this.validators = validators;
    }
    
    @Override
    public void accept(final T t, @Nonnull final ValidationResults results) {
        final ObjectArrayList<ValidationResults.ValidationResult> possibleResults = new ObjectArrayList<ValidationResults.ValidationResult>();
        final List<ValidationResults.ValidationResult> oldResults = results.getResults();
        for (final Validator<T> validator : this.validators) {
            results.setResults(null);
            validator.accept(t, results);
            if (!results.hasFailed()) {
                results.setResults(oldResults);
                return;
            }
            possibleResults.addAll((Collection<?>)results.getResults());
        }
        results.setResults(oldResults);
        for (final ValidationResults.ValidationResult p : possibleResults) {
            results.add(p);
        }
    }
    
    @Override
    public void updateSchema(final SchemaContext context, @Nonnull final Schema target) {
        if (target.getAnyOf() != null) {
            for (final Schema c : target.getAnyOf()) {
                this.updateSchema(context, c);
            }
            return;
        }
        final BuilderCodec<? extends Schema> subCodec = Schema.CODEC.getCodecFor((Class<?>)target.getClass());
        final Schema[] anyOf = new Schema[this.validators.length];
        int index = 0;
        final Schema def = (Schema)subCodec.getSupplier().get();
        for (final Validator<T> val : this.validators) {
            final Schema base = (Schema)subCodec.getSupplier().get();
            val.updateSchema(context, base);
            if (!base.equals(def)) {
                anyOf[index++] = base;
            }
        }
        if (index != 0) {
            target.setAnyOf((Schema[])Arrays.copyOf(anyOf, index));
        }
    }
}
