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

package com.hypixel.hytale.server.worldgen.util.condition.flag;

import com.hypixel.hytale.procedurallib.condition.IIntCondition;
import java.util.function.IntBinaryOperator;
import javax.annotation.Nonnull;
import java.util.Arrays;

public class CompositeInt2Flags implements Int2FlagsCondition
{
    private final FlagCondition[] flags;
    private final int defaultResult;
    
    public CompositeInt2Flags(final int defaultResult, final FlagCondition[] flags) {
        this.flags = flags;
        this.defaultResult = defaultResult;
    }
    
    @Override
    public int eval(final int input) {
        int output = this.defaultResult;
        for (final FlagCondition flag : this.flags) {
            output = flag.eval(input, output);
        }
        return output;
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "CompositeInt2Flags{flags=" + Arrays.toString(this.flags) + ", defaultResult=" + this.defaultResult;
    }
    
    public static class FlagCondition implements IntBinaryOperator
    {
        private final IIntCondition condition;
        private final FlagOperator operator;
        private final int flags;
        
        public FlagCondition(final IIntCondition condition, final FlagOperator operator, final int flags) {
            this.condition = condition;
            this.operator = operator;
            this.flags = flags;
        }
        
        public int eval(final int input, int output) {
            if (this.condition.eval(input)) {
                output = this.operator.apply(output, this.flags);
            }
            return output;
        }
        
        @Override
        public int applyAsInt(final int input, final int output) {
            return this.eval(input, output);
        }
        
        @Nonnull
        @Override
        public String toString() {
            return "FlagOperator{condition=" + String.valueOf(this.condition) + ", operator=" + String.valueOf(this.operator) + ", flags=" + this.flags;
        }
    }
}
