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

package com.hypixel.hytale.builtin.buildertools.interactions;

import com.hypixel.hytale.component.Holder;
import com.hypixel.hytale.server.core.inventory.transaction.ItemStackTransaction;
import com.hypixel.hytale.server.core.inventory.container.ItemContainer;
import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.server.core.asset.type.item.config.Item;
import com.hypixel.hytale.component.CommandBuffer;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.component.AddReason;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.ComponentAccessor;
import com.hypixel.hytale.component.RemoveReason;
import com.hypixel.hytale.server.core.inventory.ItemStack;
import com.hypixel.hytale.server.core.modules.entity.player.PlayerSettings;
import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
import com.hypixel.hytale.server.core.modules.entity.item.ItemComponent;
import com.hypixel.hytale.protocol.InteractionState;
import com.hypixel.hytale.server.core.entity.entities.Player;
import com.hypixel.hytale.server.core.modules.interaction.interaction.CooldownHandler;
import com.hypixel.hytale.server.core.entity.InteractionContext;
import javax.annotation.Nonnull;
import com.hypixel.hytale.protocol.InteractionType;
import com.hypixel.hytale.server.core.modules.interaction.interaction.config.RootInteraction;
import com.hypixel.hytale.codec.builder.BuilderCodec;
import com.hypixel.hytale.server.core.modules.interaction.interaction.config.SimpleInstantInteraction;

public class PickupItemInteraction extends SimpleInstantInteraction
{
    public static final BuilderCodec<PickupItemInteraction> CODEC;
    public static final String DEFAULT_ID = "*PickupItem";
    public static final RootInteraction DEFAULT_ROOT;
    
    public PickupItemInteraction(final String id) {
        super(id);
    }
    
    protected PickupItemInteraction() {
    }
    
    @Override
    protected final void firstRun(@Nonnull final InteractionType type, @Nonnull final InteractionContext context, @Nonnull final CooldownHandler cooldownHandler) {
        final Ref<EntityStore> ref = context.getEntity();
        final CommandBuffer<EntityStore> commandBuffer = context.getCommandBuffer();
        final Player playerComponent = commandBuffer.getComponent(ref, Player.getComponentType());
        if (playerComponent == null) {
            context.getState().state = InteractionState.Failed;
            return;
        }
        final Ref<EntityStore> targetRef = context.getTargetEntity();
        if (targetRef == null || !targetRef.isValid()) {
            context.getState().state = InteractionState.Failed;
            return;
        }
        final ItemComponent itemComponent = commandBuffer.getComponent(targetRef, ItemComponent.getComponentType());
        if (itemComponent == null) {
            context.getState().state = InteractionState.Failed;
            return;
        }
        final TransformComponent transformComponent = commandBuffer.getComponent(targetRef, TransformComponent.getComponentType());
        if (transformComponent == null) {
            context.getState().state = InteractionState.Failed;
            return;
        }
        final ItemStack itemStack = itemComponent.getItemStack();
        final Item item = itemStack.getItem();
        final Vector3d itemEntityPosition = transformComponent.getPosition();
        PlayerSettings playerSettings = commandBuffer.getComponent(ref, PlayerSettings.getComponentType());
        if (playerSettings == null) {
            playerSettings = PlayerSettings.defaults();
        }
        final ItemContainer itemContainer = playerComponent.getInventory().getContainerForItemPickup(item, playerSettings);
        final ItemStackTransaction transaction = itemContainer.addItemStack(itemStack);
        final ItemStack remainder = transaction.getRemainder();
        if (ItemStack.isEmpty(remainder)) {
            itemComponent.setRemovedByPlayerPickup(true);
            commandBuffer.removeEntity(targetRef, RemoveReason.REMOVE);
            playerComponent.notifyPickupItem(ref, itemStack, itemEntityPosition, commandBuffer);
            final Holder<EntityStore> pickupItemHolder = ItemComponent.generatePickedUpItem(targetRef, commandBuffer, ref, itemEntityPosition);
            commandBuffer.addEntity(pickupItemHolder, AddReason.SPAWN);
        }
        else if (!remainder.equals(itemStack)) {
            final int quantity = itemStack.getQuantity() - remainder.getQuantity();
            itemComponent.setItemStack(remainder);
            final Holder<EntityStore> pickupItemHolder2 = ItemComponent.generatePickedUpItem(targetRef, commandBuffer, ref, itemEntityPosition);
            commandBuffer.addEntity(pickupItemHolder2, AddReason.SPAWN);
            if (quantity > 0) {
                playerComponent.notifyPickupItem(ref, itemStack.withQuantity(quantity), itemEntityPosition, commandBuffer);
            }
        }
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "PickupItemInteraction{} " + super.toString();
    }
    
    static {
        CODEC = BuilderCodec.builder(PickupItemInteraction.class, PickupItemInteraction::new, SimpleInstantInteraction.CODEC).documentation("Picks up an item entity and adds it to the player's inventory.").build();
        DEFAULT_ROOT = new RootInteraction("*PickupItem", new String[] { "*PickupItem" });
    }
}
