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

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

import javax.annotation.Nullable;
import com.hypixel.hytale.server.core.universe.Universe;
import com.hypixel.hytale.builtin.creativehub.config.CreativeHubEntityConfig;
import com.hypixel.hytale.server.core.universe.world.spawn.ISpawnProvider;
import com.hypixel.hytale.component.ComponentAccessor;
import com.hypixel.hytale.builtin.instances.InstancesPlugin;
import com.hypixel.hytale.math.vector.Transform;
import com.hypixel.hytale.builtin.creativehub.CreativeHubPlugin;
import com.hypixel.hytale.builtin.creativehub.config.CreativeHubWorldConfig;
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 com.hypixel.hytale.server.core.command.system.CommandContext;
import com.hypixel.hytale.protocol.GameMode;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.core.Message;
import com.hypixel.hytale.server.core.command.system.basecommands.AbstractPlayerCommand;

public class HubCommand extends AbstractPlayerCommand
{
    @Nonnull
    private static final Message MESSAGE_NOT_IN_HUB_WORLD;
    @Nonnull
    private static final Message MESSAGE_ALREADY_IN_HUB;
    
    public HubCommand() {
        super("hub", "server.commands.hub.desc");
        this.addAliases("converge", "convergence");
        this.setPermissionGroup(GameMode.Creative);
    }
    
    @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 World parentWorld = this.findParentHubWorld(store, ref);
        if (parentWorld == null) {
            playerRef.sendMessage(HubCommand.MESSAGE_NOT_IN_HUB_WORLD);
            return;
        }
        final CreativeHubWorldConfig hubConfig = CreativeHubWorldConfig.get(parentWorld.getWorldConfig());
        if (hubConfig == null || hubConfig.getStartupInstance() == null) {
            playerRef.sendMessage(HubCommand.MESSAGE_NOT_IN_HUB_WORLD);
            return;
        }
        final World currentHub = CreativeHubPlugin.get().getActiveHubInstance(parentWorld);
        if (currentHub != null && world.equals(currentHub)) {
            playerRef.sendMessage(HubCommand.MESSAGE_ALREADY_IN_HUB);
            return;
        }
        final ISpawnProvider spawnProvider = parentWorld.getWorldConfig().getSpawnProvider();
        final Transform returnPoint = (spawnProvider != null) ? spawnProvider.getSpawnPoint(parentWorld, playerRef.getUuid()) : new Transform();
        final World hubInstance = CreativeHubPlugin.get().getOrSpawnHubInstance(parentWorld, hubConfig, returnPoint);
        InstancesPlugin.teleportPlayerToInstance(ref, store, hubInstance, null);
    }
    
    @Nullable
    private World findParentHubWorld(@Nonnull final Store<EntityStore> store, @Nonnull final Ref<EntityStore> ref) {
        final CreativeHubEntityConfig hubEntityConfig = store.getComponent(ref, CreativeHubEntityConfig.getComponentType());
        if (hubEntityConfig != null && hubEntityConfig.getParentHubWorldUuid() != null) {
            final World parentWorld = Universe.get().getWorld(hubEntityConfig.getParentHubWorldUuid());
            if (parentWorld != null) {
                final CreativeHubWorldConfig hubConfig = CreativeHubWorldConfig.get(parentWorld.getWorldConfig());
                if (hubConfig != null && hubConfig.getStartupInstance() != null) {
                    return parentWorld;
                }
            }
        }
        return null;
    }
    
    static {
        MESSAGE_NOT_IN_HUB_WORLD = Message.translation("server.commands.hub.notInHubWorld");
        MESSAGE_ALREADY_IN_HUB = Message.translation("server.commands.hub.alreadyInHub");
    }
}
