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

package com.hypixel.hytale.server.core.command.system;

import javax.annotation.Nullable;
import java.util.regex.Pattern;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import java.util.List;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.core.Message;

public class Tokenizer
{
    public static final char MULTI_ARG_SEPARATOR_CHAR = ',';
    public static final char MULTI_ARG_BEGIN_CHAR = '[';
    public static final char MULTI_ARG_END_CHAR = ']';
    public static final String MULTI_ARG_SEPARATOR;
    public static final String MULTI_ARG_BEGIN;
    public static final String MULTI_ARG_END;
    private static final Message MESSAGE_COMMANDS_PARSING_ERROR_UNBALANCED_QUOTES;
    
    @Nullable
    public static List<String> parseArguments(@Nonnull final String input, @Nonnull final ParseResult parseResult) {
        final List<String> parsedTokens = new ObjectArrayList<String>();
        final String[] firstSplit = input.split(Pattern.quote(" "), 2);
        parsedTokens.add(firstSplit[0]);
        if (firstSplit.length == 1) {
            return parsedTokens;
        }
        String argsStr = firstSplit[1];
        char quote = '\0';
        int tokenStart = 0;
        boolean inList = false;
        for (int i = 0; i < argsStr.length(); ++i) {
            final char c = argsStr.charAt(i);
            boolean extractToken = false;
            Label_0642: {
                switch (c) {
                    case '\\': {
                        if (argsStr.length() <= i + 1) {
                            parseResult.fail(Message.translation("server.commands.parsing.error.invalidEscape").param("index", i + 1).param("input", input));
                            return null;
                        }
                        final char nextCharacter = argsStr.charAt(i + 1);
                        switch (nextCharacter) {
                            case '\"':
                            case '\'':
                            case ',':
                            case '[':
                            case '\\':
                            case ']': {
                                argsStr = argsStr.substring(0, i) + argsStr.substring(i + 1);
                                ++i;
                                break Label_0642;
                            }
                            default: {
                                parseResult.fail(Message.translation("server.commands.parsing.error.invalidEscapeForSymbol").param("symbol", nextCharacter).param("index", i + 1).param("input", input).param("command", input));
                                return null;
                            }
                        }
                        break;
                    }
                    case ' ': {
                        if (quote != '\0') {
                            break;
                        }
                        if (tokenStart < i) {
                            parsedTokens.add(argsStr.substring(tokenStart, i));
                        }
                        tokenStart = i + 1;
                        break;
                    }
                    case '\"': {
                        if (quote == '\0') {
                            quote = '\"';
                            break;
                        }
                        if (quote == '\"') {
                            quote = '\0';
                            final String extraction = argsStr.substring(tokenStart, i + 1);
                            if (!extraction.isEmpty()) {
                                parsedTokens.add(extraction);
                            }
                            tokenStart = i + 1;
                            break;
                        }
                        break;
                    }
                    case '\'': {
                        if (quote == '\0') {
                            quote = '\'';
                            break;
                        }
                        if (quote == '\'') {
                            quote = '\0';
                            final String extraction = argsStr.substring(tokenStart, i + 1);
                            if (!extraction.isEmpty()) {
                                parsedTokens.add(extraction);
                            }
                            tokenStart = i + 1;
                            break;
                        }
                        break;
                    }
                    case '[': {
                        if (quote != '\0') {
                            break;
                        }
                        if (inList) {
                            parseResult.fail(Message.translation("server.commands.parsing.error.cannotBeginListInsideList").param("index", i));
                            return null;
                        }
                        inList = true;
                        tokenStart = i;
                        extractToken = true;
                        break;
                    }
                    case ']': {
                        if (quote != '\0') {
                            break;
                        }
                        if (!inList) {
                            parseResult.fail(Message.translation("server.commands.parsing.error.cannotEndListWithoutStarting").param("index", i));
                            return null;
                        }
                        final String extraction = argsStr.substring(tokenStart, i);
                        if (!extraction.isEmpty()) {
                            parsedTokens.add(extraction);
                        }
                        tokenStart = i;
                        inList = false;
                        extractToken = true;
                        break;
                    }
                    case ',': {
                        if (quote != '\0') {
                            break;
                        }
                        final String extraction = argsStr.substring(tokenStart, i);
                        if (!extraction.isEmpty()) {
                            parsedTokens.add(extraction);
                        }
                        tokenStart = i;
                        extractToken = true;
                        break;
                    }
                }
            }
            if (extractToken) {
                parsedTokens.add(argsStr.substring(tokenStart, i + 1));
                tokenStart = i + 1;
            }
            if (tokenStart > argsStr.length()) {
                tokenStart = argsStr.length();
                break;
            }
        }
        if (quote != '\0') {
            parseResult.fail(Tokenizer.MESSAGE_COMMANDS_PARSING_ERROR_UNBALANCED_QUOTES);
            return null;
        }
        if (tokenStart != argsStr.length()) {
            parsedTokens.add(argsStr.substring(tokenStart));
        }
        return parsedTokens;
    }
    
    static {
        MULTI_ARG_SEPARATOR = String.valueOf(',');
        MULTI_ARG_BEGIN = String.valueOf('[');
        MULTI_ARG_END = String.valueOf(']');
        MESSAGE_COMMANDS_PARSING_ERROR_UNBALANCED_QUOTES = Message.translation("server.commands.parsing.error.unbalancedQuotes");
    }
}
