from enum import IntEnum
from ...core.message import (
    MessageType,
    MessageRequest,
    MessageResponse,
    MessageBody,
)


class C2MessageEnum(IntEnum):
    sensor_light = 0x01
    child_lock = 0x10
    foam_shield = 0x1F
    water_temp_level = 0x09
    seat_temp_level = 0x0a
    dry_level = 0x0c


C2_MESSAGE_KEYS = {
    C2MessageEnum.child_lock: {True: 0x01 << 4, False: 0x00},
    C2MessageEnum.sensor_light: {True: 0x01 << 1, False: 0x00},
    C2MessageEnum.foam_shield: {True: 0x01 << 2, False: 0x00},
    C2MessageEnum.dry_level: {0: 0x00, 1: 0x01 << 1, 2: 0x02 << 1, 3: 0x03 << 1},
    C2MessageEnum.seat_temp_level: {0: 0x00, 1: 0x01 << 3, 2: 0x02 << 3, 3: 0x03 << 3, 4: 0x04 << 3, 5: 0x05 << 3},
    C2MessageEnum.water_temp_level: {0: 0x00, 1: 0x01, 2: 0x02, 3: 0x03, 4: 0x04, 5: 0x05}
}


class MessageC2Base(MessageRequest):
    def __init__(self, device_protocol_version, message_type, body_type):
        super().__init__(
            device_protocol_version=device_protocol_version,
            device_type=0xC2,
            message_type=message_type,
            body_type=body_type
        )

    @property
    def _body(self):
        raise NotImplementedError


class MessageQuery(MessageC2Base):
    def __init__(self, device_protocol_version):
        super().__init__(
            device_protocol_version=device_protocol_version,
            message_type=MessageType.query,
            body_type=0x01)

    @property
    def _body(self):
        return bytearray([0x01])


class MessagePower(MessageC2Base):
    def __init__(self, device_protocol_version):
        super().__init__(
            device_protocol_version=device_protocol_version,
            message_type=MessageType.set,
            body_type=0x00)
        self.power = False
    @property
    def _body(self):
        if self.power:
            self.body_type = 0x01
        else:
            self.body_type = 0x02
        return bytearray([0x01])


class MessagePowerOff(MessageC2Base):
    def __init__(self, device_protocol_version):
        super().__init__(
            device_protocol_version=device_protocol_version,
            message_type=MessageType.set,
            body_type=0x02)

    @property
    def _body(self):
        return bytearray([0x01])


class MessageSet(MessageC2Base):
    def __init__(self, device_protocol_version):
        super().__init__(
            device_protocol_version=device_protocol_version,
            message_type=MessageType.set,
            body_type=0x00)

        self.child_lock = None
        self.sensor_light = None
        self.water_temp_level = None
        self.seat_temp_level = None
        self.dry_level = None
        self.foam_shield = None

    @property
    def _body(self):
        self.body_type = 0x14
        key = 0x00
        value = 0x00
        if self.child_lock is not None:
            key = C2MessageEnum.child_lock
            value = self.child_lock
        elif self.sensor_light is not None:
            key = C2MessageEnum.sensor_light
            value = self.sensor_light
        elif self.water_temp_level is not None:
            key = C2MessageEnum.water_temp_level
            value = self.water_temp_level
        elif self.seat_temp_level is not None:
            key = C2MessageEnum.seat_temp_level
            value = self.seat_temp_level
        elif self.dry_level is not None:
            key = C2MessageEnum.dry_level
            value = self.dry_level
        elif self.foam_shield is not None:
            key = C2MessageEnum.foam_shield
            value = self.foam_shield
        value = C2_MESSAGE_KEYS.get(key).get(value)
        return bytearray([key, value])


class C2MessageBody(MessageBody):
    def __init__(self, body):
        super().__init__(body)
        self.power = (body[2] & 0x01) > 0
        self.seat_status = (body[3] & 0x01) > 0
        self.dry_level = ((body[6] & 0x7E) >> 1)
        self.water_temp_level = (body[9] & 0x07)
        self.seat_temp_level = ((body[9] & 0x38) >> 3)
        self.lid_status = (body[12] & 0x40) > 0
        self.foam_shield = (body[13] & 0x80) > 0
        self.sensor_light = (body[14] & 0x01) > 0
        self.light_status = (body[14] & 0x02) > 0
        self.child_lock = (body[14] & 0x04) > 0
        self.water_temperature = body[11]
        self.seat_temperature = body[11]
        self.filter_life = 100 - body[19]


class C2Notify1MessageBody(MessageBody):
    def __init__(self, body):
        super().__init__(body)


class MessageC2Response(MessageResponse):
    def __init__(self, message):
        super().__init__(message)
        if self.message_type in [MessageType.notify1, MessageType.query, MessageType.set]:
            self.set_body(C2MessageBody(super().body))
        self.set_attr()