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


class MessageE6Base(MessageRequest):
    def __init__(self, device_protocol_version, message_type):
        super().__init__(
            device_protocol_version=device_protocol_version,
            device_type=0xE6,
            message_type=message_type,
            body_type=None
        )

    @property
    def body(self):
        return self._body

    @property
    def _body(self):
        raise NotImplementedError


class MessageQuery(MessageE6Base):
    def __init__(self, device_protocol_version):
        super().__init__(
            device_protocol_version=device_protocol_version,
            message_type=MessageType.query)

    @property
    def _body(self):
        return bytearray([0x01, 0x01] + [0] * 28)


class MessageSet(MessageE6Base):
    def __init__(self, device_protocol_version):
        super().__init__(
            device_protocol_version=device_protocol_version,
            message_type=MessageType.set)
        self.main_power = None
        self.heating_temperature = None
        self.bathing_temperature = None
        self.heating_power = None

    @property
    def _body(self):
        body = []
        if self.main_power is not None:
            main_power = 0x01 if self.main_power else 0x02
            body = [main_power, 0x01]
        elif self.heating_temperature is not None:
            body = [0x04, 0x13, self.heating_temperature]
        elif self.bathing_temperature is not None:
            body = [0x04, 0x12, self.bathing_temperature]
        elif self.heating_power is not None:
            heating_power = 0x01 if self.heating_power else 0x02
            body = [0x04, 0x01, heating_power]
        body_len = len(body)
        return bytearray(body + [0] * (30 - body_len))


class E6GeneralMessageBody(MessageBody):
    def __init__(self, body):
        super().__init__(body)
        self.main_power = (body[2] & 0x04) > 0
        self.heating_working = (body[2] & 0x10) > 0
        self.bathing_working = (body[2] & 0x20) > 0
        self.heating_power = (body[4] & 0x01) > 0
        self.min_temperature = [
            body[16],
            body[11]
        ]
        self.max_temperature = [
            body[15],
            body[10]
        ]
        self.heating_temperature = body[17]
        self.bathing_temperature = body[12]
        self.heating_leaving_temperature = body[14]
        self.bathing_leaving_temperature = body[8]


class MessageE6Response(MessageResponse):
    def __init__(self, message):
        super().__init__(message)
        self.set_body(E6GeneralMessageBody(super().body))
        self.set_attr()