import paho.mqtt.client as mqtt
import re

from enum import auto
from .payload.temphum import TempHumDataPayload
from .esp import MqttEspBase
from ..util import HashableEnum


class MqttTempHumNodes(HashableEnum):
    KBN_SH_HALL = auto()
    KBN_SH_BATHROOM = auto()
    KBN_SH_LIVINGROOM = auto()
    KBN_SH_BEDROOM = auto()

    KBN_BH_2FL = auto()
    KBN_BH_2FL_STREET = auto()
    KBN_BH_1FL_LIVINGROOM = auto()
    KBN_BH_1FL_BEDROOM = auto()
    KBN_BH_1FL_BATHROOM = auto()

    KBN_NH_1FL_INV = auto()
    KBN_NH_1FL_CENTER = auto()
    KBN_NH_1LF_KT = auto()
    KBN_NH_1FL_DS = auto()
    KBN_NH_1FS_EZ = auto()

    SPB_FLAT120_CABINET = auto()


class MqttTempHum(MqttEspBase):
    TOPIC_LEAF = 'temphum'

    def on_message(self, client: mqtt.Client, userdata, msg):
        if super().on_message(client, userdata, msg):
            return

        try:
            match = re.match(self.get_mqtt_topics(['data']), msg.topic)
            if not match:
                return

            device_id = match.group(1)
            subtopic = match.group(2)

            message = None
            if subtopic == 'data':
                message = TempHumDataPayload.unpack(msg.payload)

            if message and self._message_callback:
                self._message_callback(device_id, message)

        except Exception as e:
            self._logger.exception(str(e))
