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

package com.hypixel.hytale.server.npc.commands;

import com.hypixel.hytale.server.core.modules.collision.CollisionConfig;
import com.hypixel.hytale.server.core.modules.collision.BoxBlockIntersectionEvaluator;
import com.hypixel.hytale.server.core.asset.type.model.config.Model;
import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.math.shape.Box;
import java.util.logging.Level;
import com.hypixel.hytale.server.core.Message;
import com.hypixel.hytale.math.util.MathUtil;
import com.hypixel.hytale.math.util.ChunkUtil;
import com.hypixel.hytale.server.npc.NPCPlugin;
import com.hypixel.hytale.server.core.modules.collision.CollisionModule;
import com.hypixel.hytale.component.ComponentAccessor;
import com.hypixel.hytale.server.core.modules.entity.component.ModelComponent;
import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
import com.hypixel.hytale.server.core.modules.entity.component.BoundingBox;
import com.hypixel.hytale.server.core.entity.entities.Player;
import com.hypixel.hytale.server.npc.util.PositionProbeWater;
import com.hypixel.hytale.server.npc.util.PositionProbeAir;
import com.hypixel.hytale.server.core.modules.collision.CollisionResult;
import com.hypixel.hytale.server.core.universe.world.World;
import com.hypixel.hytale.server.core.universe.PlayerRef;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.Store;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.core.command.system.CommandContext;
import com.hypixel.hytale.server.core.command.system.basecommands.AbstractPlayerCommand;
import com.hypixel.hytale.server.core.command.system.AbstractCommand;
import com.hypixel.hytale.server.core.command.system.basecommands.AbstractCommandCollection;

public class NPCTestCommand extends AbstractCommandCollection
{
    public NPCTestCommand() {
        super("test", "server.commands.npc.test.desc");
        this.addSubCommand(new ProbeTestCommand());
    }
    
    public static class ProbeTestCommand extends AbstractPlayerCommand
    {
        public ProbeTestCommand() {
            super("probe", "server.commands.npc.test.probe.desc");
        }
        
        @Override
        protected void execute(@Nonnull final CommandContext context, @Nonnull final Store<EntityStore> store, @Nonnull final Ref<EntityStore> ref, @Nonnull final PlayerRef playerRef, @Nonnull final World world) {
            final CollisionResult collisionResult = new CollisionResult();
            final PositionProbeAir probeAir = new PositionProbeAir();
            final PositionProbeWater probeWater = new PositionProbeWater();
            final Player playerComponent = store.getComponent(ref, Player.getComponentType());
            assert playerComponent != null;
            final BoundingBox boundingBoxComponent = store.getComponent(ref, BoundingBox.getComponentType());
            assert boundingBoxComponent != null;
            final Box playerCollider = boundingBoxComponent.getBoundingBox();
            final TransformComponent transformComponent = store.getComponent(ref, TransformComponent.getComponentType());
            assert transformComponent != null;
            final ModelComponent modelComponent = store.getComponent(ref, ModelComponent.getComponentType());
            assert modelComponent != null;
            final Vector3d position = transformComponent.getPosition();
            final Model model = modelComponent.getModel();
            final float eyeHeight = (model != null) ? model.getEyeHeight(ref, store) : 0.0f;
            final boolean testAir = probeAir.probePosition(ref, playerCollider, position, collisionResult, store);
            final boolean testWater = probeWater.probePosition(ref, playerCollider, position, collisionResult, eyeHeight, store);
            final boolean validatePosition = CollisionModule.get().validatePosition(world, playerCollider, position, 4, null, (_this, collisionCode, collision, collisionConfig) -> collisionConfig.blockId != -1, collisionResult) != -1;
            final NPCPlugin npcPlugin = NPCPlugin.get();
            String text = "Pos Y [" + position.y + ", " + String.valueOf(playerCollider) + "] Height=" + world.getChunk(ChunkUtil.indexChunkFromBlock(position.x, position.z)).getHeight(MathUtil.floor(position.x), MathUtil.floor(position.z));
            context.sendMessage(Message.raw(text));
            npcPlugin.getLogger().at(Level.INFO).log(text);
            text = "Air " + testAir + " " + String.valueOf(probeAir);
            context.sendMessage(Message.raw(text));
            npcPlugin.getLogger().at(Level.INFO).log(text);
            text = "Water " + testWater + " " + String.valueOf(probeWater);
            context.sendMessage(Message.raw(text));
            npcPlugin.getLogger().at(Level.INFO).log(text);
            text = "ValidatePosition " + validatePosition;
            context.sendMessage(Message.raw(text));
            npcPlugin.getLogger().at(Level.INFO).log(text);
        }
    }
}
