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

package com.hypixel.hytale.server.core.command.commands.debug;

import com.hypixel.hytale.server.core.command.system.arguments.system.Argument;
import com.hypixel.hytale.server.core.command.system.ParseResult;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.function.Function;
import java.util.Arrays;
import com.hypixel.hytale.server.core.Message;
import java.util.Map;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import com.hypixel.hytale.server.core.HytaleServer;
import com.hypixel.hytale.logger.backend.HytaleLoggerBackend;
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.FlagArg;
import com.hypixel.hytale.server.core.command.system.arguments.system.OptionalArg;
import com.hypixel.hytale.server.core.command.system.arguments.system.RequiredArg;
import com.hypixel.hytale.server.core.command.system.arguments.types.SingleArgumentType;
import javax.annotation.Nonnull;
import java.util.logging.Level;
import com.hypixel.hytale.server.core.command.system.basecommands.CommandBase;

public class LogCommand extends CommandBase
{
    @Nonnull
    private static final Level[] STANDARD_LEVELS;
    @Nonnull
    private static final String LEVELS_STRING;
    @Nonnull
    private static final SingleArgumentType<Level> LOG_LEVEL;
    @Nonnull
    private final RequiredArg<String> loggerArg;
    @Nonnull
    private final OptionalArg<Level> levelArg;
    @Nonnull
    private final FlagArg saveFlag;
    @Nonnull
    private final FlagArg resetFlag;
    
    public LogCommand() {
        super("log", "server.commands.log.desc");
        this.loggerArg = this.withRequiredArg("logger", "server.commands.log.logger.desc", ArgTypes.STRING);
        this.levelArg = this.withOptionalArg("level", "server.commands.log.level.desc", LogCommand.LOG_LEVEL);
        this.saveFlag = this.withFlagArg("save", "server.commands.log.save.desc");
        this.resetFlag = this.withFlagArg("reset", "server.commands.log.reset.desc");
    }
    
    @Override
    protected void executeSync(@Nonnull final CommandContext context) {
        String loggerName = this.loggerArg.get(context);
        HytaleLoggerBackend logger;
        if (loggerName.equalsIgnoreCase("global")) {
            loggerName = "global";
            logger = HytaleLoggerBackend.getLogger();
        }
        else {
            logger = HytaleLoggerBackend.getLogger(loggerName);
        }
        if (this.levelArg.provided(context)) {
            final Level level = this.levelArg.get(context);
            logger.setLevel(level);
            boolean saved = false;
            if (((Argument<Arg, Boolean>)this.saveFlag).get(context)) {
                final Map<String, Level> logLevels = new Object2ObjectOpenHashMap<String, Level>(HytaleServer.get().getConfig().getLogLevels());
                logLevels.put(logger.getLoggerName(), level);
                HytaleServer.get().getConfig().setLogLevels(logLevels);
                saved = true;
            }
            context.sendMessage(Message.translation("server.commands.log.setLogger").param("name", loggerName).param("level", level.getName()).param("saved", saved ? " and saved to config!!" : ""));
        }
        else {
            if (((Argument<Arg, Boolean>)this.resetFlag).get(context)) {
                final Map<String, Level> logLevels2 = new Object2ObjectOpenHashMap<String, Level>(HytaleServer.get().getConfig().getLogLevels());
                logLevels2.remove(logger.getLoggerName());
                HytaleServer.get().getConfig().setLogLevels(logLevels2);
                context.sendMessage(Message.translation("server.commands.log.removedLogger").param("name", loggerName));
            }
            context.sendMessage(Message.translation("server.commands.log.setLoggerNoSave").param("name", loggerName).param("level", logger.getLevel().getName()));
        }
    }
    
    static {
        STANDARD_LEVELS = new Level[] { Level.OFF, Level.SEVERE, Level.WARNING, Level.INFO, Level.CONFIG, Level.FINE, Level.FINER, Level.FINEST, Level.ALL };
        LEVELS_STRING = Arrays.stream(LogCommand.STANDARD_LEVELS).map((Function<? super Level, ?>)Level::getName).collect((Collector<? super Object, ?, String>)Collectors.joining(", "));
        LOG_LEVEL = new SingleArgumentType<Level>(Message.translation("server.commands.parsing.argtype.logLevel.usage").param("levels", LogCommand.LEVELS_STRING), (String[])Arrays.stream(LogCommand.STANDARD_LEVELS).map((Function<? super Level, ?>)Level::getName).toArray(String[]::new)) {
            @Nonnull
            @Override
            public Level parse(@Nonnull final String input, @Nonnull final ParseResult parseResult) {
                try {
                    return Level.parse(input.toUpperCase());
                }
                catch (final IllegalArgumentException e) {
                    parseResult.fail(Message.translation("server.commands.log.invalidLevel").param("input", input).param("level", Level.INFO.getName()));
                    return Level.INFO;
                }
            }
        };
    }
}
