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

package com.hypixel.hytale.builtin.instances.command;

import com.hypixel.hytale.server.core.universe.world.World;
import com.hypixel.hytale.component.Store;
import com.hypixel.hytale.math.vector.Transform;
import com.hypixel.hytale.server.core.modules.entity.teleport.Teleport;
import com.hypixel.hytale.component.ComponentAccessor;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.builtin.instances.InstancesPlugin;
import com.hypixel.hytale.server.core.Message;
import com.hypixel.hytale.server.core.asset.AssetModule;
import java.util.concurrent.CompletableFuture;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.core.command.system.CommandContext;
import com.hypixel.hytale.codec.validation.Validator;
import com.hypixel.hytale.builtin.instances.InstanceValidator;
import com.hypixel.hytale.server.core.command.system.arguments.types.ArgumentType;
import com.hypixel.hytale.server.core.command.system.arguments.types.ArgTypes;
import com.hypixel.hytale.server.core.command.system.arguments.system.RequiredArg;
import com.hypixel.hytale.server.core.command.system.basecommands.AbstractAsyncCommand;

public class InstanceEditLoadCommand extends AbstractAsyncCommand
{
    private final RequiredArg<String> instanceNameArg;
    
    public InstanceEditLoadCommand() {
        super("load", "server.commands.instances.edit.load.desc");
        this.instanceNameArg = this.withRequiredArg("instanceName", "server.commands.instances.edit.arg.name", ArgTypes.STRING).addValidator((Validator<String>)new InstanceValidator());
    }
    
    @Nonnull
    public CompletableFuture<Void> executeAsync(@Nonnull final CommandContext context) {
        if (AssetModule.get().getBaseAssetPack().isImmutable()) {
            context.sendMessage(Message.translation("server.commands.instances.edit.assetsImmutable"));
            return CompletableFuture.completedFuture((Void)null);
        }
        final String name = this.instanceNameArg.get(context);
        context.sendMessage(Message.translation("server.commands.instance.beginLoading").param("name", name));
        InstancesPlugin.get();
        return InstancesPlugin.loadInstanceAssetForEdit(name).thenAccept(world -> {
            context.sendMessage(Message.translation("server.commands.instance.doneLoading").param("world", world.getName()));
            if (context.isPlayer()) {
                final Ref<EntityStore> ref = context.senderAsPlayerRef();
                if (ref != null && ref.isValid()) {
                    final Store<EntityStore> playerStore = ref.getStore();
                    final World playerWorld = playerStore.getExternalData().getWorld();
                    playerWorld.execute(() -> {
                        final Transform spawnTransform = world.getWorldConfig().getSpawnProvider().getSpawnPoint(ref, playerStore);
                        final Teleport teleportComponent = Teleport.createForPlayer(world, spawnTransform);
                        playerStore.addComponent(ref, Teleport.getComponentType(), teleportComponent);
                    });
                }
            }
        });
    }
}
