"""
Common enumerations used within CORE.
"""

from enum import Enum


class MessageFlags(Enum):
    """
    CORE message flags.
    """

    NONE = 0x00
    ADD = 0x01
    DELETE = 0x02
    CRI = 0x04
    LOCAL = 0x08
    STRING = 0x10
    TEXT = 0x20
    TTY = 0x40


class NodeTypes(Enum):
    """
    Node types.
    """

    DEFAULT = 0
    PHYSICAL = 1
    SWITCH = 4
    HUB = 5
    WIRELESS_LAN = 6
    RJ45 = 7
    TUNNEL = 8
    EMANE = 10
    TAP_BRIDGE = 11
    PEER_TO_PEER = 12
    CONTROL_NET = 13
    DOCKER = 15
    LXC = 16


class LinkTypes(Enum):
    """
    Link types.
    """

    WIRELESS = 0
    WIRED = 1


class RegisterTlvs(Enum):
    """
    Register type, length, value enumerations.
    """

    WIRELESS = 0x01
    MOBILITY = 0x02
    UTILITY = 0x03
    EXECUTE_SERVER = 0x04
    GUI = 0x05
    EMULATION_SERVER = 0x06
    SESSION = 0x0A


class ConfigDataTypes(Enum):
    """
    Configuration data types.
    """

    UINT8 = 0x01
    UINT16 = 0x02
    UINT32 = 0x03
    UINT64 = 0x04
    INT8 = 0x05
    INT16 = 0x06
    INT32 = 0x07
    INT64 = 0x08
    FLOAT = 0x09
    STRING = 0x0A
    BOOL = 0x0B


class EventTypes(Enum):
    """
    Event types.
    """

    NONE = 0
    DEFINITION_STATE = 1
    CONFIGURATION_STATE = 2
    INSTANTIATION_STATE = 3
    RUNTIME_STATE = 4
    DATACOLLECT_STATE = 5
    SHUTDOWN_STATE = 6
    START = 7
    STOP = 8
    PAUSE = 9
    RESTART = 10
    FILE_OPEN = 11
    FILE_SAVE = 12
    SCHEDULED = 13
    RECONFIGURE = 14
    INSTANTIATION_COMPLETE = 15

    def should_start(self) -> bool:
        return self.value > self.DEFINITION_STATE.value

    def already_collected(self) -> bool:
        return self.value >= self.DATACOLLECT_STATE.value


class ExceptionLevels(Enum):
    """
    Exception levels.
    """

    NONE = 0
    FATAL = 1
    ERROR = 2
    WARNING = 3
    NOTICE = 4


class NetworkPolicy(Enum):
    ACCEPT = "ACCEPT"
    DROP = "DROP"


class TransportType(Enum):
    RAW = "raw"
    VIRTUAL = "virtual"