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

package com.hypixel.hytale.builtin.npccombatactionevaluator.conditions;

import com.hypixel.hytale.codec.Codec;
import com.hypixel.hytale.codec.KeyedCodec;
import com.hypixel.hytale.server.npc.decisionmaker.core.EvaluationContext;
import com.hypixel.hytale.component.CommandBuffer;
import com.hypixel.hytale.component.Ref;
import javax.annotation.Nonnull;
import com.hypixel.hytale.component.ArchetypeChunk;
import com.hypixel.hytale.builtin.npccombatactionevaluator.memory.TargetMemory;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.ComponentType;
import com.hypixel.hytale.codec.builder.BuilderCodec;
import com.hypixel.hytale.codec.codecs.EnumCodec;
import com.hypixel.hytale.server.npc.decisionmaker.core.conditions.base.ScaledCurveCondition;

public class TargetMemoryCountCondition extends ScaledCurveCondition
{
    public static final EnumCodec<TargetType> TARGET_TYPE_CODEC;
    public static final BuilderCodec<TargetMemoryCountCondition> CODEC;
    protected static final ComponentType<EntityStore, TargetMemory> TARGET_MEMORY_COMPONENT_TYPE;
    protected TargetType targetType;
    
    public TargetMemoryCountCondition() {
        this.targetType = TargetType.Hostile;
    }
    
    @Override
    protected double getInput(final int selfIndex, @Nonnull final ArchetypeChunk<EntityStore> archetypeChunk, final Ref<EntityStore> target, final CommandBuffer<EntityStore> commandBuffer, final EvaluationContext context) {
        final TargetMemory memory = archetypeChunk.getComponent(selfIndex, TargetMemoryCountCondition.TARGET_MEMORY_COMPONENT_TYPE);
        return switch (this.targetType.ordinal()) {
            default -> throw new MatchException(null, null);
            case 2 -> memory.getKnownFriendlies().size() + memory.getKnownHostiles().size();
            case 0 -> memory.getKnownHostiles().size();
            case 1 -> memory.getKnownFriendlies().size();
        };
    }
    
    static {
        TARGET_TYPE_CODEC = new EnumCodec<TargetType>(TargetType.class).documentKey(TargetType.All, "All known targets.").documentKey(TargetType.Friendly, "Known friendly targets.").documentKey(TargetType.Hostile, "Known hostile targets.");
        CODEC = BuilderCodec.builder(TargetMemoryCountCondition.class, TargetMemoryCountCondition::new, ScaledCurveCondition.ABSTRACT_CODEC).documentation("A scaled curve condition that returns a utility value based on the number of known targets in the memory.").appendInherited(new KeyedCodec("TargetType", TargetMemoryCountCondition.TARGET_TYPE_CODEC), (condition, e) -> condition.targetType = e, condition -> condition.targetType, (condition, parent) -> condition.targetType = parent.targetType).documentation("The type of targets to count.").add().build();
        TARGET_MEMORY_COMPONENT_TYPE = TargetMemory.getComponentType();
    }
    
    private enum TargetType
    {
        Hostile, 
        Friendly, 
        All;
    }
}
