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

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

import java.nio.file.Path;
import com.hypixel.hytale.server.core.util.io.FileUtil;
import java.util.UUID;
import java.util.logging.Level;
import com.hypixel.hytale.server.core.universe.world.WorldConfig;
import java.nio.file.Files;
import java.nio.file.LinkOption;
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.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 InstanceEditCopyCommand extends AbstractAsyncCommand
{
    private final RequiredArg<String> originNameArg;
    private final RequiredArg<String> destinationNameArg;
    
    public InstanceEditCopyCommand() {
        super("copy", "server.commands.instances.edit.copy.desc");
        this.originNameArg = this.withRequiredArg("instanceToCopy", "server.commands.instances.editcopy.origin.name", ArgTypes.STRING);
        this.destinationNameArg = this.withRequiredArg("newInstanceName", "server.commands.instances.editcopy.destination.name", ArgTypes.STRING);
    }
    
    @Nonnull
    @Override
    protected 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 instanceToCopy = this.originNameArg.get(context);
        final Path originPath = InstancesPlugin.getInstanceAssetPath(instanceToCopy);
        if (!Files.exists(originPath, new LinkOption[0])) {
            context.sendMessage(Message.translation("server.commands.instances.edit.copy.originNotFound").param("path", originPath.toAbsolutePath().toString()));
            return CompletableFuture.completedFuture((Void)null);
        }
        final String destinationName = this.destinationNameArg.get(context);
        final Path destinationPath = originPath.getParent().resolve(destinationName);
        if (Files.exists(destinationPath, new LinkOption[0])) {
            context.sendMessage(Message.translation("server.commands.instances.edit.copy.destinationExists").param("path", destinationPath.toAbsolutePath().toString()));
            return CompletableFuture.completedFuture((Void)null);
        }
        WorldConfig worldConfig;
        try {
            worldConfig = WorldConfig.load(originPath.resolve("instance.bson")).join();
        }
        catch (final Throwable t) {
            context.sendMessage(Message.translation("server.commands.instances.edit.copy.errorLoading"));
            InstancesPlugin.get().getLogger().at(Level.SEVERE).log("Error loading origin instance config for copy", t);
            return CompletableFuture.completedFuture((Void)null);
        }
        worldConfig.setUuid(UUID.randomUUID());
        final Path destinationConfigFile = destinationPath.resolve("instance.bson");
        try {
            FileUtil.copyDirectory(originPath, destinationPath);
            Files.deleteIfExists(destinationConfigFile);
        }
        catch (final Throwable t2) {
            context.sendMessage(Message.translation("server.commands.instances.edit.copy.errorCopying"));
            InstancesPlugin.get().getLogger().at(Level.SEVERE).log("Error copying instance folder for copy", t2);
            return CompletableFuture.completedFuture((Void)null);
        }
        return WorldConfig.save(destinationConfigFile, worldConfig).thenRun(() -> context.sendMessage(Message.translation("server.commands.instances.copiedInstanceAssetConfig").param("origin", instanceToCopy).param("destination", destinationName)));
    }
}
