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

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

import com.hypixel.hytale.function.predicate.BiFloatPredicate;
import com.hypixel.hytale.codec.codecs.EnumCodec;
import com.hypixel.hytale.codec.validation.Validators;
import com.hypixel.hytale.codec.KeyedCodec;
import com.hypixel.hytale.codec.Codec;
import com.hypixel.hytale.server.core.modules.entitystats.EntityStatValue;
import java.time.Instant;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.Ref;
import javax.annotation.Nonnull;
import com.hypixel.hytale.codec.builder.BuilderCodec;

public class StatCondition extends EntityStatBoundCondition
{
    @Nonnull
    public static final BuilderCodec<StatCondition> CODEC;
    protected StatComparisonType comparison;
    protected float amount;
    
    protected StatCondition() {
        this.comparison = StatComparisonType.GTE;
    }
    
    public StatCondition(final boolean inverse, final int stat, final float amount) {
        super(inverse, stat);
        this.comparison = StatComparisonType.GTE;
        this.amount = amount;
    }
    
    @Override
    public boolean eval0(@Nonnull final Ref<EntityStore> ref, @Nonnull final Instant currentTime, @Nonnull final EntityStatValue statValue) {
        return this.comparison.satisfies(statValue.get(), this.amount);
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "StatCondition{amount=" + this.amount + "comparison=" + this.comparison.name() + "} " + super.toString();
    }
    
    static {
        CODEC = BuilderCodec.builder(StatCondition.class, StatCondition::new, EntityStatBoundCondition.CODEC).append(new KeyedCodec<Float>("Amount", Codec.FLOAT), (condition, value) -> condition.amount = value, condition -> condition.amount).documentation("The amount to compare the entity's stat against.").addValidator(Validators.nonNull()).add().appendInherited(new KeyedCodec("Comparison", new EnumCodec(StatComparisonType.class)), (condition, o) -> condition.comparison = o, condition -> condition.comparison, (condition, parent) -> condition.comparison = parent.comparison).documentation("The comparison type used for evaluating the stat condition.").add().build();
    }
    
    public enum StatComparisonType
    {
        GTE(">=", (v1, v2) -> v1 >= v2), 
        GT(">", (v1, v2) -> v1 > v2), 
        LTE("<=", (v1, v2) -> v1 <= v2), 
        LT("<", (v1, v2) -> v1 < v2), 
        EQUAL("=", (v1, v2) -> v1 == v2);
        
        private final String prefix;
        private final BiFloatPredicate satisfies;
        
        private StatComparisonType(final String prefix, final BiFloatPredicate satisfies) {
            this.prefix = prefix;
            this.satisfies = satisfies;
        }
        
        public String getPrefix() {
            return this.prefix;
        }
        
        public boolean satisfies(final float compareTo, final float f) {
            return this.satisfies.test(compareTo, f);
        }
    }
}
