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

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

import com.hypixel.hytale.server.core.modules.entitystats.asset.modifier.RegeneratingModifier;
import com.hypixel.hytale.server.core.modules.entitystats.asset.condition.Condition;
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.server.core.modules.entitystats.asset.EntityStatType;

public class RegeneratingValue
{
    @Nonnull
    private final EntityStatType.Regenerating regenerating;
    private float remainingUntilRegen;
    
    public RegeneratingValue(@Nonnull final EntityStatType.Regenerating regenerating) {
        this.regenerating = regenerating;
    }
    
    public boolean shouldRegenerate(@Nonnull final ComponentAccessor<EntityStore> store, @Nonnull final Ref<EntityStore> ref, @Nonnull final Instant currentTime, final float dt, @Nonnull final EntityStatType.Regenerating regenerating) {
        this.remainingUntilRegen -= dt;
        if (this.remainingUntilRegen < 0.0f) {
            this.remainingUntilRegen += regenerating.getInterval();
            return Condition.allConditionsMet(store, ref, currentTime, regenerating);
        }
        return false;
    }
    
    public float regenerate(@Nonnull final ComponentAccessor<EntityStore> store, @Nonnull final Ref<EntityStore> ref, @Nonnull final Instant currentTime, final float dt, @Nonnull final EntityStatValue value, final float currentAmount) {
        if (!this.shouldRegenerate(store, ref, currentTime, dt, this.regenerating)) {
            return 0.0f;
        }
        float toAdd = switch (this.regenerating.getRegenType()) {
            default -> throw new MatchException(null, null);
            case ADDITIVE -> this.regenerating.getAmount();
            case PERCENTAGE -> this.regenerating.getAmount() * (value.getMax() - value.getMin());
        };
        if (this.regenerating.getModifiers() != null) {
            for (final RegeneratingModifier modifier : this.regenerating.getModifiers()) {
                toAdd *= modifier.getModifier(store, ref, currentTime);
            }
        }
        return this.regenerating.clampAmount(toAdd, currentAmount, value);
    }
    
    public EntityStatType.Regenerating getRegenerating() {
        return this.regenerating;
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "RegeneratingValue{regenerating=" + String.valueOf(this.regenerating) + ", remainingUntilRegen=" + this.remainingUntilRegen;
    }
}
