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

package com.hypixel.hytale.builtin.adventure.npcobjectives.task;

import com.hypixel.hytale.builtin.adventure.objectives.config.task.ObjectiveTaskAsset;
import com.hypixel.hytale.builtin.adventure.objectives.config.task.CountObjectiveTaskAsset;
import it.unimi.dsi.fastutil.objects.ObjectListIterator;
import com.hypixel.hytale.logger.HytaleLogger;
import it.unimi.dsi.fastutil.objects.ObjectList;
import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.builtin.adventure.npcobjectives.resources.KillTrackerResource;
import com.hypixel.hytale.builtin.adventure.npcobjectives.transaction.KillTaskTransaction;
import java.util.logging.Level;
import com.hypixel.hytale.common.util.ArrayUtil;
import com.hypixel.hytale.builtin.adventure.objectives.ObjectivePlugin;
import java.util.List;
import com.hypixel.hytale.server.spawning.SpawningPlugin;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.component.spatial.SpatialResource;
import com.hypixel.hytale.component.ComponentAccessor;
import com.hypixel.hytale.builtin.adventure.objectives.transaction.TransactionRecord;
import com.hypixel.hytale.component.Store;
import com.hypixel.hytale.server.core.universe.world.World;
import com.hypixel.hytale.builtin.adventure.objectives.Objective;
import com.hypixel.hytale.builtin.adventure.npcobjectives.assets.KillObjectiveTaskAsset;
import javax.annotation.Nonnull;
import com.hypixel.hytale.builtin.adventure.npcobjectives.assets.KillSpawnMarkerObjectiveTaskAsset;
import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
import com.hypixel.hytale.server.spawning.spawnmarkers.SpawnMarkerEntity;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.ComponentType;
import com.hypixel.hytale.codec.builder.BuilderCodec;

public class KillSpawnMarkerObjectiveTask extends KillObjectiveTask
{
    public static final BuilderCodec<KillSpawnMarkerObjectiveTask> CODEC;
    private static final ComponentType<EntityStore, SpawnMarkerEntity> SPAWN_MARKER_COMPONENT_TYPE;
    private static final ComponentType<EntityStore, TransformComponent> TRANSFORM_COMPONENT_TYPE;
    
    public KillSpawnMarkerObjectiveTask(@Nonnull final KillSpawnMarkerObjectiveTaskAsset asset, final int taskSetIndex, final int taskIndex) {
        super(asset, taskSetIndex, taskIndex);
    }
    
    protected KillSpawnMarkerObjectiveTask() {
    }
    
    @Nonnull
    @Override
    public KillSpawnMarkerObjectiveTaskAsset getAsset() {
        return (KillSpawnMarkerObjectiveTaskAsset)super.getAsset();
    }
    
    @Nonnull
    @Override
    protected TransactionRecord[] setup0(@Nonnull final Objective objective, @Nonnull final World world, @Nonnull final Store<EntityStore> store) {
        final Vector3d objectivePosition = objective.getPosition(store);
        if (objectivePosition != null) {
            final KillSpawnMarkerObjectiveTaskAsset asset = this.getAsset();
            final ObjectList<Ref<EntityStore>> results = SpatialResource.getThreadLocalReferenceList();
            final SpatialResource<Ref<EntityStore>, EntityStore> spatialResource = store.getResource(SpawningPlugin.get().getSpawnMarkerSpatialResource());
            spatialResource.getSpatialStructure().collect(objectivePosition, asset.getRadius(), results);
            final String[] spawnMarkerIds = asset.getSpawnMarkerIds();
            final HytaleLogger logger = ObjectivePlugin.get().getLogger();
            for (Ref<EntityStore> entityReference : results) {
                final SpawnMarkerEntity entitySpawnMarkerComponent = store.getComponent(entityReference, KillSpawnMarkerObjectiveTask.SPAWN_MARKER_COMPONENT_TYPE);
                assert entitySpawnMarkerComponent != null;
                final String spawnMarkerId = entitySpawnMarkerComponent.getSpawnMarkerId();
                if (!ArrayUtil.contains(spawnMarkerIds, spawnMarkerId)) {
                    continue;
                }
                world.execute(() -> entitySpawnMarkerComponent.trigger(entityReference, store));
                logger.at(Level.INFO).log("Triggered SpawnMarker '" + spawnMarkerId + "' at position: " + String.valueOf(store.getComponent(entityReference, KillSpawnMarkerObjectiveTask.TRANSFORM_COMPONENT_TYPE).getPosition()));
            }
        }
        final KillTaskTransaction transaction = new KillTaskTransaction(this, objective, store);
        store.getResource(KillTrackerResource.getResourceType()).watch(transaction);
        return new TransactionRecord[] { transaction };
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "KillSpawnMarkerObjectiveTask{} " + super.toString();
    }
    
    static {
        CODEC = BuilderCodec.builder(KillSpawnMarkerObjectiveTask.class, KillSpawnMarkerObjectiveTask::new, KillObjectiveTask.CODEC).build();
        SPAWN_MARKER_COMPONENT_TYPE = SpawnMarkerEntity.getComponentType();
        TRANSFORM_COMPONENT_TYPE = TransformComponent.getComponentType();
    }
}
