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

package com.hypixel.hytale.builtin.adventure.objectives.interactions;

import com.hypixel.hytale.codec.validation.Validator;
import com.hypixel.hytale.codec.validation.Validators;
import com.hypixel.hytale.codec.Codec;
import com.hypixel.hytale.builtin.adventure.objectives.Objective;
import com.hypixel.hytale.server.core.universe.world.World;
import java.util.logging.Level;
import java.util.Set;
import org.bson.BsonDocument;
import com.hypixel.hytale.component.Store;
import com.hypixel.hytale.server.core.inventory.ItemStack;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.CommandBuffer;
import com.hypixel.hytale.builtin.adventure.objectives.ObjectivePlugin;
import com.hypixel.hytale.server.core.universe.PlayerRef;
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.builtin.adventure.objectives.config.objectivesetup.ObjectiveTypeSetup;
import java.util.UUID;
import com.hypixel.hytale.codec.KeyedCodec;
import com.hypixel.hytale.codec.builder.BuilderCodec;
import com.hypixel.hytale.server.core.modules.interaction.interaction.config.SimpleInstantInteraction;

public class StartObjectiveInteraction extends SimpleInstantInteraction
{
    public static final BuilderCodec<StartObjectiveInteraction> CODEC;
    public static final KeyedCodec<UUID> OBJECTIVE_UUID;
    protected ObjectiveTypeSetup objectiveTypeSetup;
    
    @Override
    protected void firstRun(@Nonnull final InteractionType type, @Nonnull final InteractionContext context, @Nonnull final CooldownHandler cooldownHandler) {
        final CommandBuffer<EntityStore> commandBuffer = context.getCommandBuffer();
        final Ref<EntityStore> ref = context.getEntity();
        final PlayerRef playerRefComponent = commandBuffer.getComponent(ref, PlayerRef.getComponentType());
        if (playerRefComponent == null) {
            return;
        }
        final ItemStack itemStack = context.getHeldItem();
        final Store<EntityStore> store = commandBuffer.getStore();
        final UUID objectiveUUID = itemStack.getFromMetadataOrNull(StartObjectiveInteraction.OBJECTIVE_UUID);
        if (objectiveUUID == null) {
            this.startObjective(playerRefComponent, context, itemStack, store);
        }
        else {
            ObjectivePlugin.get().addPlayerToExistingObjective(store, playerRefComponent.getUuid(), objectiveUUID);
        }
    }
    
    private void startObjective(@Nonnull final PlayerRef player, @Nonnull final InteractionContext context, @Nonnull final ItemStack itemStack, @Nonnull final Store<EntityStore> store) {
        BsonDocument itemStackMetadata = itemStack.getMetadata();
        if (itemStackMetadata == null) {
            itemStackMetadata = new BsonDocument();
        }
        final World world = store.getExternalData().getWorld();
        final Objective objective = this.objectiveTypeSetup.setup(Set.of(player.getUuid()), world.getWorldConfig().getUuid(), null, store);
        if (objective == null) {
            ObjectivePlugin.get().getLogger().at(Level.WARNING).log("Failed to start objective '%s' from item: %s", this.objectiveTypeSetup.getObjectiveIdToStart(), itemStack);
            return;
        }
        StartObjectiveInteraction.OBJECTIVE_UUID.put(itemStackMetadata, objective.getObjectiveUUID());
        final ItemStack clonedItemStack = itemStack.withMetadata(itemStackMetadata);
        objective.setObjectiveItemStarter(clonedItemStack);
        context.setHeldItem(clonedItemStack);
        context.getHeldItemContainer().replaceItemStackInSlot(context.getHeldItemSlot(), itemStack, clonedItemStack);
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "StartObjectiveInteraction{objectiveTypeSetup=" + String.valueOf(this.objectiveTypeSetup) + "} " + super.toString();
    }
    
    static {
        CODEC = BuilderCodec.builder(StartObjectiveInteraction.class, StartObjectiveInteraction::new, SimpleInstantInteraction.CODEC).documentation("Starts the given objective or adds the player to an existing one.").appendInherited(new KeyedCodec("Setup", ObjectiveTypeSetup.CODEC), (startObjectiveInteraction, objectiveTypeSetup) -> startObjectiveInteraction.objectiveTypeSetup = objectiveTypeSetup, startObjectiveInteraction -> startObjectiveInteraction.objectiveTypeSetup, (startObjectiveInteraction, parent) -> startObjectiveInteraction.objectiveTypeSetup = parent.objectiveTypeSetup).addValidator(Validators.nonNull()).add().build();
        OBJECTIVE_UUID = new KeyedCodec<UUID>("ObjectiveUUID", Codec.UUID_BINARY);
    }
}
