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

package com.hypixel.hytale.server.core.modules.entitystats.asset.condition;

import com.hypixel.hytale.codec.validation.Validator;
import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
import com.hypixel.hytale.codec.validation.Validators;
import com.hypixel.hytale.codec.Codec;
import com.hypixel.hytale.codec.KeyedCodec;
import com.hypixel.hytale.codec.codecs.EnumCodec;
import java.util.Arrays;
import java.time.Instant;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.ComponentAccessor;
import javax.annotation.Nonnull;
import com.hypixel.hytale.codec.builder.BuilderCodec;

public class LogicCondition extends Condition
{
    @Nonnull
    public static final BuilderCodec<LogicCondition> CODEC;
    protected Operator operator;
    protected Condition[] conditions;
    
    protected LogicCondition() {
    }
    
    public LogicCondition(final boolean inverse, @Nonnull final Operator operator, @Nonnull final Condition[] conditions) {
        super(inverse);
        this.operator = operator;
        this.conditions = conditions;
    }
    
    @Override
    public boolean eval0(@Nonnull final ComponentAccessor<EntityStore> componentAccessor, @Nonnull final Ref<EntityStore> ref, @Nonnull final Instant currentTime) {
        return this.operator.eval(componentAccessor, ref, currentTime, this.conditions);
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "LogicCondition{operator=" + String.valueOf(this.operator) + ", conditions=" + Arrays.toString(this.conditions) + "} " + super.toString();
    }
    
    static {
        CODEC = BuilderCodec.builder(LogicCondition.class, LogicCondition::new, Condition.BASE_CODEC).append(new KeyedCodec<Operator>("Operator", new EnumCodec<Operator>(Operator.class)), (condition, value) -> condition.operator = value, condition -> condition.operator).documentation("The logical operator to combine the conditions.").addValidator(Validators.nonNull()).add().append(new KeyedCodec("Conditions", new ArrayCodec(Condition.CODEC, Condition[]::new)), (condition, value) -> condition.conditions = value, condition -> condition.conditions).documentation("The array of conditions to be evaluated.").addValidator(Validators.nonNull()).add().build();
    }
    
    public enum Operator permits LogicCondition$Operator$1, LogicCondition$Operator$2
    {
        AND {
            @Override
            public boolean eval(@Nonnull final ComponentAccessor<EntityStore> store, @Nonnull final Ref<EntityStore> ref, @Nonnull final Instant currentTime, @Nonnull final Condition[] conditions) {
                for (final Condition condition : conditions) {
                    if (!condition.eval(store, ref, currentTime)) {
                        return false;
                    }
                }
                return true;
            }
        }, 
        OR {
            @Override
            public boolean eval(@Nonnull final ComponentAccessor<EntityStore> store, @Nonnull final Ref<EntityStore> ref, @Nonnull final Instant currentTime, @Nonnull final Condition[] conditions) {
                for (final Condition condition : conditions) {
                    if (condition.eval(store, ref, currentTime)) {
                        return true;
                    }
                }
                return false;
            }
        };
        
        public abstract boolean eval(@Nonnull final ComponentAccessor<EntityStore> p0, @Nonnull final Ref<EntityStore> p1, @Nonnull final Instant p2, @Nonnull final Condition[] p3);
    }
}
