# ==============================================================================
# ПРОТОКОЛ ОЧЕРЕДИ (Универсальный Клиент <-> Универсальный Сервер)
# ==============================================================================

# Разделитель для команд и их аргументов в сетевых сообщениях.
SEPARATOR = ":"


# --- Сообщения от Клиента к Серверу ---
class Q_CMD:
    """
    Префиксы команд, которые клиент отправляет на сервер.
    Формат: КОМАНДА<SEPARATOR>параметр1<SEPARATOR>параметр2...
    """
    # Запрос на регистрацию в очереди с указанием имени.
    # Пример: "REGISTER:Ivanov Ivan"
    REGISTER = "REGISTER"

    # Команда, предназначенная для обработчика манипулятора.
    # Сервер просто пересылает полезную нагрузку (все, что после CMD:) обработчику.
    # Пример: "CMD:MOVE_TO 150 0 100"
    MANIPULATOR = "CMD"


# --- Сообщения от Сервера к Клиенту ---
class Q_RSP:
    """
    Префиксы ответов и команд, которые сервер отправляет клиенту.
    """
    # Ответ на успешную регистрацию, если клиент сразу стал активным.
    # Пример: "WELCOME:ACTIVE"
    WELCOME_ACTIVE = "WELCOME:ACTIVE"

    # Ответ на успешную регистрацию, если клиент поставлен в очередь.
    # Параметры: <ваша_позиция>:<всего_в_очереди>
    # Пример: "WELCOME:WAITING:2:3"
    WELCOME_WAITING = "WELCOME:WAITING"

    # Команда клиенту о том, что его очередь подошла.
    # Пример: "PROMOTED:ACTIVE"
    PROMOTED = "PROMOTED:ACTIVE"

    # Периодическое сообщение (heartbeat) для ожидающих клиентов.
    # Параметры: <ваша_позиция>:<всего_в_очереди>
    # Пример: "QUEUE_STATUS:2:3"
    QUEUE_STATUS = "QUEUE_STATUS"

    # Ответ от обработчика манипулятора.
    # Сервер просто пересылает ответ от обработчика клиенту.
    # Пример: "RSP:ACK" или "RSP:POSITION 150 0 100"
    MANIPULATOR_RESPONSE = "RSP"

    # --- Сообщения об ошибках ---

    # Ошибка: клиент с таким именем уже есть в очереди.
    # Пример: "ERROR:NAME_TAKEN"
    ERROR_NAME_TAKEN = "ERROR:NAME_TAKEN"

    # Ошибка: ожидающий клиент попытался отправить команду манипулятору.
    # Пример: "ERROR:NOT_YOUR_TURN"
    ERROR_NOT_YOUR_TURN = "ERROR:NOT_YOUR_TURN"
