"""
Это вспомогательный скрипт для тестирования сервера из задания в 6 блоке.

Для запуска скрипта на локальном компьютере разместите рядом файл client.py,
где содержится код клиента, который реализован в задание блока 5.

Сначала запускаете ваш сервер на адресе 127.0.0.1 и порту 8888, а затем 
запускаете этот скрипт.

"""

import sys

from client import Client, ClientProtocolError, ClientSocketError


def run(host, port):

    client1 = Client(host, port, timeout=5)
    client2 = Client(host, port, timeout=5)

    try:
        client1.send("malformed command test\n")
        client2.send("malformed command test\n")

    except ClientSocketError as err:
        print(f"Ошибка общения с сервером: {err.__class__}: {err}")
        sys.exit(1)

    except ClientProtocolError:
        pass

    else:
        print(
            "Неверная команда, отправленная серверу, должна возвращать ошибку протокола"
        )
        sys.exit(1)

    try:
        client1.put("k1", 0.25, timestamp=1)
        client2.put("k1", 2.156, timestamp=2)
        client1.put("k1", 0.35, timestamp=3)
        client2.put("k2", 30, timestamp=4)
        client1.put("k2", 40, timestamp=5)
        client1.put("k2", 40, timestamp=5)

    except Exception as err:
        print(f"Ошибка вызова client.put(...) {err.__class__}: {err}")
        sys.exit(1)

    expected_metrics = {
        "k1": [(1, 0.25), (2, 2.156), (3, 0.35)],
        "k2": [(4, 30.0), (5, 40.0)],
    }

    try:
        metrics = client1.get("*")
        if metrics != expected_metrics:
            print(
                f"client.get('*') вернул неверный результат. Ожидается: {expected_metrics}. Получено: {metrics}"
            )
            sys.exit(1)

    except Exception as err:
        print(f"Ошибка вызова client.get('*') {err.__class__}: {err}")
        sys.exit(1)

    expected_metrics = {"k2": [(4, 30.0), (5, 40.0)]}

    try:
        metrics = client2.get("k2")
        if metrics != expected_metrics:
            print(
                f"client.get('k2') вернул неверный результат. Ожидается: {expected_metrics}. Получено: {metrics}"
            )
            sys.exit(1)

    except Exception as err:
        print(f"Ошибка вызова client.get('k2') {err.__class__}: {err}")
        sys.exit(1)

    try:
        result = client1.get("k3")
        if result != {}:
            print(
                f"Ошибка вызова метода get с ключом, который еще не был добавлен. Ожидается: пустой словарь. Получено: {result}"
            )
            sys.exit(1)

    except Exception as err:
        print(
            f"Ошибка вызова метода get с ключом, который еще не был добавлен: {err.__class__} {err}"
        )
        sys.exit(1)

    print("Похоже, что все верно!")


if __name__ == "__main__":
    run("127.0.0.1", 8888)
