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

package com.hypixel.hytale.builtin.teleport.commands.warp;

import com.hypixel.hytale.math.vector.Vector3f;
import com.hypixel.hytale.math.vector.Vector3d;
import java.util.Map;
import com.hypixel.hytale.component.AddReason;
import com.hypixel.hytale.builtin.teleport.Warp;
import java.time.Instant;
import com.hypixel.hytale.math.vector.Transform;
import com.hypixel.hytale.server.core.modules.entity.component.HeadRotation;
import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
import com.hypixel.hytale.builtin.teleport.TeleportPlugin;
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.server.core.permissions.HytalePermissions;
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 javax.annotation.Nonnull;
import com.hypixel.hytale.server.core.Message;
import com.hypixel.hytale.server.core.command.system.basecommands.AbstractPlayerCommand;

public class WarpSetCommand extends AbstractPlayerCommand
{
    @Nonnull
    private static final Message MESSAGE_COMMANDS_TELEPORT_WARP_NOT_LOADED;
    @Nonnull
    private static final Message MESSAGE_COMMANDS_TELEPORT_WARP_RESERVED_KEYWORD;
    @Nonnull
    private final RequiredArg<String> nameArg;
    
    public WarpSetCommand() {
        super("set", "server.commands.warp.set.desc");
        this.nameArg = this.withRequiredArg("name", "server.commands.warp.set.name.desc", ArgTypes.STRING);
        this.requirePermission(HytalePermissions.fromCommand("warp.set"));
    }
    
    @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) {
        if (!TeleportPlugin.get().isWarpsLoaded()) {
            context.sendMessage(WarpSetCommand.MESSAGE_COMMANDS_TELEPORT_WARP_NOT_LOADED);
            return;
        }
        final Map<String, Warp> warps = TeleportPlugin.get().getWarps();
        final String newId = this.nameArg.get(context).toLowerCase();
        if ("reload".equals(newId) || "remove".equals(newId) || "set".equals(newId) || "list".equals(newId) || "go".equals(newId)) {
            context.sendMessage(WarpSetCommand.MESSAGE_COMMANDS_TELEPORT_WARP_RESERVED_KEYWORD);
            return;
        }
        final TransformComponent transformComponent = store.getComponent(ref, TransformComponent.getComponentType());
        assert transformComponent != null;
        final HeadRotation headRotationComponent = store.getComponent(ref, HeadRotation.getComponentType());
        assert headRotationComponent != null;
        final Vector3d position = transformComponent.getPosition();
        final Vector3f headRotation = headRotationComponent.getRotation();
        final Transform transform = new Transform(position.clone(), headRotation.clone());
        final Warp newWarp = new Warp(transform, newId, world, playerRef.getUsername(), Instant.now());
        warps.put(newWarp.getId().toLowerCase(), newWarp);
        final TeleportPlugin plugin = TeleportPlugin.get();
        plugin.saveWarps();
        store.addEntity(plugin.createWarp(newWarp, store), AddReason.LOAD);
        context.sendMessage(Message.translation("server.commands.teleport.warp.setWarp").param("name", newWarp.getId()));
    }
    
    static {
        MESSAGE_COMMANDS_TELEPORT_WARP_NOT_LOADED = Message.translation("server.commands.teleport.warp.notLoaded");
        MESSAGE_COMMANDS_TELEPORT_WARP_RESERVED_KEYWORD = Message.translation("server.commands.teleport.warp.reservedKeyword");
    }
}
