from enum import IntEnum


class DataInfo:
    """

    Class contains information of frame `Packing`, `ComponentOrder`, `Alignment`.

    """
    class Packing(IntEnum):
        """
        Contains values of possible packing.
        """
        P_UNKNOWN = 0
        P_PLANAR = 1
        P_PACKED = 2

    class ComponentOrder(IntEnum):
        """
        Contains values of possible component order.
        """
        CO_UNKNOWN = 0
        CO_UCDRX = 1
        CO_RGB = 2
        CO_RGBA = 3
        CO_BGR = 4
        CO_BGRA = 5
        CO_YCbCr = 6
        CO_CbY0CrY1 = 7

    class Alignment(IntEnum):
        """
        Contains values of possible alignment.
        """
        A_UNKNOWN = 0
        A_MSB = 1
        A_LSB = 2

    def __init__(self):
        self.packing = self.Packing.P_UNKNOWN
        self.component_order = self.ComponentOrder.CO_UNKNOWN
        self.alignment = self.Alignment.A_UNKNOWN

    def is_valid(self) -> bool:
        """

        Check that information is valid (not equal UNKNOWN state).

        Returns:
            object of bool type.
        """
        return self.packing != self.Packing.P_UNKNOWN and\
               self.component_order != self.ComponentOrder.CO_UNKNOWN and\
               self.alignment != self.Alignment.A_UNKNOWN

    def __str__(self):
        return f"Packing: {self.packing.name}\n" \
               f"Component Order: {self.component_order.name}\n" \
               f"Alignment: {self.alignment.name}\n"

    def __eq__(self, other):
        return self.packing == other.packing and \
               self.component_order == other.component_order and \
               self.alignment == other.alignment