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


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

    @property
    def _body(self):
        raise NotImplementedError


class MessageQuery(Message26Base):
    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([
        ])


class MessageSet(Message26Base):
    def __init__(self, device_protocol_version):
        super().__init__(
            device_protocol_version=device_protocol_version,
            message_type=MessageType.set,
            body_type=0x01)
        self.fields = {}
        self.main_light = False
        self.night_light = False
        self.mode = 0
        self.direction = 0xFD

    def read_field(self, field):
        value = self.fields.get(field, 0)
        return value if value else 0

    @property
    def _body(self):
        return bytearray([
            1 if self.main_light else 0,
            self.read_field("MAIN_LIGHT_BRIGHTNESS"),
            1 if self.night_light else 0,
            self.read_field("NIGHT_LIGHT_BRIGHTNESS"),
            self.read_field("RADAR_INDUCTION_ENABLE"),
            self.read_field("RADAR_INDUCTION_CLOSING_TIME"),
            self.read_field("LIGHT_INTENSITY_THRESHOLD"),
            self.read_field("RADAR_SENSITIVITY"),
            1 if self.mode == 1 or self.mode == 2 else 0,
            0 if not (self.mode == 1 or self.mode == 2) else 55 if self.mode == 1 else 30,
            self.read_field("HEATING_SPEED"),
            self.direction,
            1 if self.mode == 3 else 0,
            self.read_field("BATH_HEATING_TIME"),
            self.read_field("BATH_TEMPERATURE"),
            self.read_field("BATH_SPEED"),
            self.direction,
            1 if self.mode == 5 else 0,
            self.read_field("VENTILATION_SPEED"),
            self.direction,
            1 if self.mode == 6 else 0,
            self.read_field("DRYING_TIME"),
            self.read_field("DRYING_TEMPERATURE"),
            self.read_field("DRYING_SPEED"),
            self.direction,
            1 if self.mode == 4 else 0,
            self.read_field("BLOWING_SPEED"),
            self.direction,
            self.read_field("DELAY_ENABLE"),
            self.read_field("DELAY_TIME"),
            self.read_field("SOFT_WIND_ENABLE"),
            self.read_field("SOFT_WIND_TIME"),
            self.read_field("SOFT_WIND_TEMPERATURE"),
            self.read_field("SOFT_WIND_SPEED"),
            self.read_field("SOFT_WIND_DIRECTION"),
            self.read_field("WINDLESS_ENABLE"),
            self.read_field("ANION_ENABLE"),
            self.read_field("SMELLY_ENABLE"),
            self.read_field("SMELLY_THRESHOLD")
        ])


class Message26Body(MessageBody):
    def __init__(self, body):
        super().__init__(body)
        self.fields = {}
        self.main_light = self.read_byte(body, 1) > 0
        self.fields["MAIN_LIGHT_BRIGHTNESS"] = self.read_byte(body, 2)
        self.night_light = self.read_byte(body, 3) > 0
        self.fields["NIGHT_LIGHT_BRIGHTNESS"] = self.read_byte(body, 4)
        self.fields["RADAR_INDUCTION_ENABLE"] = self.read_byte(body, 5)
        self.fields["RADAR_INDUCTION_CLOSING_TIME"] = self.read_byte(body, 6)
        self.fields["LIGHT_INTENSITY_THRESHOLD"] = self.read_byte(body, 7)
        self.fields["RADAR_SENSITIVITY"] = self.read_byte(body, 8)
        heat_mode = self.read_byte(body, 9) > 0
        heat_temperature =  self.read_byte(body, 10)
        self.fields["HEATING_SPEED"] = self.read_byte(body, 11)
        heat_direction = self.read_byte(body, 12)
        bath_mode = self.read_byte(body, 13) > 0
        self.fields["BATH_HEATING_TIME"] = self.read_byte(body, 14)
        self.fields["BATH_TEMPERATURE"] = self.read_byte(body, 15)
        self.fields["BATH_SPEED"] = self.read_byte(body, 16)
        bath_direction = self.read_byte(body, 17)
        ventilation_mode = self.read_byte(body, 18) > 0
        self.fields["VENTILATION_SPEED"] = self.read_byte(body, 19)
        ventilation_direction = self.read_byte(body, 20)
        dry_mode = self.read_byte(body, 21) > 0
        self.fields["DRYING_TIME"] = self.read_byte(body, 22)
        self.fields["DRYING_TEMPERATURE"] = self.read_byte(body, 23)
        self.fields["DRYING_SPEED"] = self.read_byte(body, 24)
        dry_direction = self.read_byte(body, 25)
        blow_mode = self.read_byte(body, 26) > 0
        self.fields["BLOWING_SPEED"] = self.read_byte(body, 27)
        blow_direction = self.read_byte(body, 28)
        self.fields["DELAY_ENABLE"] = self.read_byte(body, 29)
        self.fields["DELAY_TIME"] = self.read_byte(body, 30)
        if self.read_byte(body, 31) != 0xFF:
            self.current_humidity = self.read_byte(body, 31)
        if self.read_byte(body, 32) != 0xFF:
            self.current_radar = self.read_byte(body, 32)
        if self.read_byte(body, 33) != 0xFF:
            self.current_temperature = self.read_byte(body, 33)
        self.fields["SOFT_WIND_ENABLE"] = self.read_byte(body, 38)
        self.fields["SOFT_WIND_TIME"] = self.read_byte(body, 39)
        self.fields["SOFT_WIND_TEMPERATURE"] = self.read_byte(body, 40)
        self.fields["SOFT_WIND_SPEED"] = self.read_byte(body, 41)
        self.fields["SOFT_WIND_DIRECTION"] = self.read_byte(body, 42)
        self.fields["WINDLESS_ENABLE"] = self.read_byte(body, 43)
        self.fields["ANION_ENABLE"] = self.read_byte(body, 44)
        self.fields["SMELLY_ENABLE"] = self.read_byte(body, 45)
        self.fields["SMELLY_THRESHOLD"] = self.read_byte(body, 46)
        self.mode = 0
        self.direction = 0xFD
        if heat_mode:
            if heat_temperature > 50:
                self.mode = 1
            else:
                self.mode = 2
            self.direction = heat_direction
        elif bath_mode:
            self.mode = 3
            self.direction = bath_direction
        elif blow_mode:
            self.mode = 4
            self.direction = blow_direction
        elif ventilation_mode:
            self.mode = 5
            self.direction = ventilation_direction
        elif dry_mode:
            self.mode = 6
            self.direction = dry_direction


class Message26Response(MessageResponse):
    def __init__(self, message):
        super().__init__(message)
        if self.message_type in [MessageType.set, MessageType.notify1, MessageType.query] and self.body_type == 0x01:
            self.set_body(Message26Body(super().body))
        self.set_attr()