# -*- coding: utf-8 -*-
"""
Created on Fri Jul 10 17:19:11 2026

@author: user
"""

"""
Lab004. Проверка модуля protocol.packet.

Проверяем:
1. Формирование пакета.
2. Разбор исправного пакета.
3. Восстановление текста.
4. Обнаружение повреждения CRC.
"""

from protocol.packet import (
    CRCError,
    HEADER_SIZE,
    MESSAGE_TYPE_TEXT,
    build_packet,
    parse_packet,
)


# ============================================================
# Формирование пакета
# ============================================================

message = "ПРИВЕТ SDR"
payload = message.encode("utf-8")

sequence_number = 7

packet = build_packet(
    payload=payload,
    message_type=MESSAGE_TYPE_TEXT,
    sequence_number=sequence_number,
)


print("Исходное сообщение:")
print(message)

print("\nСформированный пакет:")
print(packet.hex(" "))

print("\nРазмер пакета:")
print(len(packet), "байт")


# ============================================================
# Разбор исправного пакета
# ============================================================

parsed_packet = parse_packet(packet)

restored_message = parsed_packet.payload.decode("utf-8")


print("\n--- Разобранный пакет ---")

print("Версия:")
print(parsed_packet.version)

print("\nТип сообщения:")
print(parsed_packet.message_type)

print("\nПорядковый номер:")
print(parsed_packet.sequence_number)

print("\nПолезная нагрузка:")
print(parsed_packet.payload)

print("\nВосстановленное сообщение:")
print(restored_message)


assert parsed_packet.message_type == MESSAGE_TYPE_TEXT
assert parsed_packet.sequence_number == sequence_number
assert restored_message == message

print("\nИсправный пакет успешно разобран.")


# ============================================================
# Повреждение одного бита
# ============================================================

corrupted_packet = bytearray(packet)

# В строке "ПРИВЕТ SDR" буква S находится
# по индексу 13 внутри полезной нагрузки.
payload_byte_index = 13

packet_byte_index = (
    HEADER_SIZE + payload_byte_index
)

corrupted_packet[packet_byte_index] ^= 0x01


print("\n--- Проверка повреждённого пакета ---")


try:
    parse_packet(corrupted_packet)

except CRCError as error:
    print("Повреждение обнаружено.")
    print(error)

else:
    raise AssertionError(
        "Ошибка: повреждённый пакет был принят как исправный"
    )


print("\nВсе проверки Lab004 успешно выполнены.")