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

package com.hypixel.hytale.server.core.command.commands.utility.sleep;

import java.util.concurrent.CompletableFuture;
import com.hypixel.hytale.metrics.metric.Metric;
import com.hypixel.hytale.common.util.FormatUtil;
import java.util.concurrent.TimeUnit;
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.DefaultArg;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.core.Message;
import com.hypixel.hytale.server.core.command.system.basecommands.CommandBase;

public class SleepTestCommand extends CommandBase
{
    @Nonnull
    private static final Message MESSAGE_COMMANDS_SLEEP_TEST_INTERRUPTED;
    @Nonnull
    private final DefaultArg<Integer> sleepArg;
    @Nonnull
    private final DefaultArg<Integer> countArg;
    
    public SleepTestCommand() {
        super("test", "server.commands.sleeptest.desc");
        this.sleepArg = this.withDefaultArg("sleep", "server.commands.sleeptest.sleep.desc", ArgTypes.INTEGER, 10, "server.commands.sleeptest.sleep.defaultDesc");
        this.countArg = this.withDefaultArg("count", "server.commands.sleeptest.count.desc", ArgTypes.INTEGER, 1000, "server.commands.sleeptest.count.defaultDesc");
    }
    
    @Override
    protected void executeSync(@Nonnull final CommandContext context) {
        final int sleep = this.sleepArg.get(context);
        final int count = this.countArg.get(context);
        CompletableFuture.runAsync(() -> {
            context.sendMessage(Message.translation("server.commands.sleeptest.starting").param("count", count).param("sleep", sleep).param("ms", FormatUtil.timeUnitToString(count * (long)sleep, TimeUnit.MILLISECONDS)));
            try {
                final Metric metricDelta = new Metric();
                final Metric metricOffset = new Metric();
                for (int i = 0; i < count; ++i) {
                    final long before = System.nanoTime();
                    Thread.sleep(sleep);
                    final long after = System.nanoTime();
                    final long delta = after - before;
                    metricDelta.add(delta);
                    final long offset = delta - sleep * 1000000L;
                    metricOffset.add(offset);
                }
                context.sendMessage(Message.translation("server.commands.sleeptest.test").param("deltaMin", metricDelta.getMin()).param("deltaMax", metricDelta.getMax()).param("deltaAvg", metricDelta.getAverage()).param("deltaTime", FormatUtil.nanosToString((long)metricDelta.getAverage())).param("offsetMin", metricOffset.getMin()).param("offsetMax", metricOffset.getMax()).param("offsetAvg", metricOffset.getAverage()).param("offsetTime", FormatUtil.nanosToString((long)metricOffset.getAverage())));
            }
            catch (final InterruptedException e) {
                context.sendMessage(SleepTestCommand.MESSAGE_COMMANDS_SLEEP_TEST_INTERRUPTED);
                Thread.currentThread().interrupt();
            }
        });
    }
    
    static {
        MESSAGE_COMMANDS_SLEEP_TEST_INTERRUPTED = Message.translation("server.commands.sleeptest.interrupted");
    }
}
