import enum

import constants


class Command(enum.Enum):
    CLEAR = "clear"
    EXECUTE = "execute"
    JOIN = "join"
    LEAVE = "leave"
    PAUSE = "pause"
    PLAY = "play"
    PURGE = "purge"
    QUEUE = "queue"
    RELOAD = "reload"
    RESUME = "resume"
    SKIP = "skip"
    UPTIME = "uptime"
    VOLUME = "volume"


def match_token(token: str) -> list[Command]:
    if token.lower() == "r":
        return [Command.RELOAD]

    return list(
        filter(
            lambda command: command.value.startswith(token.lower()),
            Command.__members__.values(),
        )
    )


def match(command: str) -> None | list[Command]:
    if tokens := tokenize(command):
        return match_token(tokens[0])


def tokenize(string: str) -> list[str]:
    tokens = []
    current_token = []
    in_quotes = False
    escape_next = False

    for char in string[len(constants.PREFIX) :]:
        if escape_next:
            current_token.append(char)
            escape_next = False
        elif char == "\\":
            escape_next = True
        elif char in ['"', "'"]:
            if in_quotes:
                if current_token and current_token[0] == char:
                    in_quotes = False
            else:
                in_quotes = True
        elif char.isspace() and not in_quotes:
            if current_token:
                tokens.append("".join(current_token))
                current_token = []
        else:
            current_token.append(char)

    if current_token:
        tokens.append("".join(current_token))

    return tokens