"""Constants For Modbus Server/Client.

This is the single location for storing default values for the servers and clients.

Based up on the original of pyModbus https://github.com/pymodbus-dev/pymodbus/blob/v3.9.2/pymodbus/constants.py

Used in ha-sinapsi-alfa since it was deprecated and causing a lot of warnings in HA log.
"""

import enum

INTERNAL_ERROR = "Pymodbus internal error"


class ModbusStatus(int, enum.Enum):
    """These represent various status codes in the modbus protocol.

    attribute:: WAITING

    This indicates that a modbus device is currently
    waiting for a given request to finish some running task.

    attribute:: READY

    This indicates that a modbus device is currently
    free to perform the next request task.

    attribute:: ON

    This indicates that the given modbus entity is on

    attribute:: OFF

    This indicates that the given modbus entity is off

    attribute:: SLAVE_ON

    This indicates that the given modbus slave is running

    attribute:: SLAVE_OFF

    This indicates that the given modbus slave is not running
    """

    WAITING = 0xFFFF
    READY = 0x0000
    ON = 0xFF00
    OFF = 0x0000
    SLAVE_ON = 0xFF
    SLAVE_OFF = 0x00


class Endian(str, enum.Enum):
    """An enumeration representing the various byte endianness.

    attribute:: AUTO

    This indicates that the byte order is chosen by the
    current native environment.

    attribute:: BIG

    This indicates that the bytes are in big endian format

    attribute:: LITTLE

    This indicates that the bytes are in little endian format

    note:: I am simply borrowing the format strings from the
    python struct module for my convenience.
    """

    AUTO = "@"
    BIG = ">"
    LITTLE = "<"


class ModbusPlusOperation(int, enum.Enum):
    """Represents the type of modbus plus request.

    attribute:: GET_STATISTICS

    Operation requesting that the current modbus plus statistics
    be returned in the response.

    attribute:: CLEAR_STATISTICS

    Operation requesting that the current modbus plus statistics
    be cleared and not returned in the response.
    """

    GET_STATISTICS = 0x0003
    CLEAR_STATISTICS = 0x0004


class DeviceInformation(int, enum.Enum):
    """Represents what type of device information to read.

    attribute:: BASIC

    This is the basic (required) device information to be returned.
    This includes VendorName, ProductCode, and MajorMinorRevision
    code.

    attribute:: REGULAR

    In addition to basic data objects, the device provides additional
    and optional identification and description data objects. All of
    the objects of this category are defined in the standard but their
    implementation is optional.

    attribute:: EXTENDED

    In addition to regular data objects, the device provides additional
    and optional identification and description private data about the
    physical device itself. All of these data are device dependent.

    attribute:: SPECIFIC

    Request to return a single data object.
    """

    BASIC = 0x01
    REGULAR = 0x02
    EXTENDED = 0x03
    SPECIFIC = 0x04

    def __str__(self):
        """Override to force int representation for enum members."""
        return str(int(self))


class MoreData(int, enum.Enum):
    """Represents the more follows condition.

    attribute:: NOTHING

       This indicates that no more objects are going to be returned.

    attribute:: KEEP_READING

       This indicates that there are more objects to be returned.
    """

    NOTHING = 0x00
    KEEP_READING = 0xFF
