"""Network Time Protocol v4"""
import logging

from packetracer import packetracer

logger = logging.getLogger("packetracer")

# Leap Indicator (LI) Codes
NO_WARNING = 0
LAST_MINUTE_61_SECONDS = 1
LAST_MINUTE_59_SECONDS = 2
ALARM_CONDITION = 3

# Mode Codes
RESERVED = 0
SYMMETRIC_ACTIVE = 1
SYMMETRIC_PASSIVE = 2
CLIENT = 3
SERVER = 4
BROADCAST = 5
CONTROL_MESSAGE = 6
PRIVATE = 7


class NTP(packetracer.Packet):
    __hdr__ = (
        ("flags", "B", 0x1C),  # li | v | mode
        ("stratum", "B", 0x2),
        ("interval", "B", 0x4),
        ("precision", "B", 0xE9),
        ("delay", "I", 0),
        ("dispersion", "I", 0),
        ("id", "4s", b"\x00\x01\x02\x03"),
        # timestamps: [seconds since 1.1.1900 | fraction of seconds]
        ("update_time", "8s", b"\x00" * 8),
        ("originate_time", "8s", b"" * 8),
        ("receive_time", "8s", b"" * 8),
        ("transmit_time", "8s", b"" * 8)
    )

    # li  v     mode [xx][xx x][xxx]
    def __get_v(self):
        return (self.flags >> 3) & 0x7

    def __set_v(self, value):
        self.flags = (self.flags & ~0x38) | ((value & 0x7) << 3)

    v = property(__get_v, __set_v)

    def __get_li(self):
        return (self.flags >> 6) & 0x3

    def __set_li(self, value):
        self.flags = (self.flags & ~0xC0) | ((value & 0x3) << 6)

    li = property(__get_li, __set_li)

    def __get_mode(self):
        return self.flags & 0x7

    def __set_mode(self, value):
        self.flags = (self.flags & ~0x7) | (value & 0x7)

    mode = property(__get_mode, __set_mode)
