import time
import json
import paho.mqtt.client as mqtt
import logging
import sys
logger = logging.getLogger(__name__)

class mqttService(object):
    def __init__(self, client_id,
                       broker            = "127.0.0.1",
                       port              = 1883,
                       user_name         = "",
                       password          = "",
                       callback          = None,
                       service           = None
                ):

        self.dataDictionary = {}
        self.mqttc          = mqtt.Client(client_id = client_id,
                                          transport = 'tcp',
                                          protocol  = mqtt.MQTTv5)

        self.callback = callback
        self.service = service
        self.mqttc.on_message = self.on_message
        self.mqttc.username_pw_set(username = user_name, password = password)
        self.mqttc.connect(broker, port=port)
        self.mqttc.loop_start()

        logging.basicConfig(stream=sys.stdout, level=logging.INFO)

    def publish(self, topic, dataDictionary):
        serial = json.dumps(dataDictionary, indent=4, separators=(',', ': '))
        self.mqttc.publish(topic, serial)

    def on_message(self, client, userdata, msg):
        if self.callback and self.service:
            self.callback(self.service, msg.topic, msg.payload.decode("utf-8"))

    def subscribe(self, topic):
        self.mqttc.subscribe(topic, qos=0)

if __name__ == "__main__":
    logger.info("Service running in foreground")

    myDictionary = {
            "manufacturer":      "Hanover Displays Ltd",
            "productType":       "Console",
            "ProductName":       "EG4",
            "variantName":       "",
            "serialNumber":      "1234",
            "hardwareVersion":   "A1",
            "dateOfManufacture": "20231206",
        }

    mqttService = mqttService("mqtt-hardware-definition-service")

    while 1:
        mqttService.publish("info/device", myDictionary)
        time.sleep(5)
