"""
Name: status_subscriber
Title: Status Subscriber
Author: Cooper
Date: 26 02 2024

Desc: This is the shitty little module that is needed to get sign status' to the EG4 from signs running MQTT.

It needs to subscribe to the status topics that the sign publishes in MQTT every 30 seconds.  As soon as a payload is
obtained then it will need to parse it and funnel it out to the EG4

"""
import time
import _thread
import logging

from hanip.itxpt import mqtt_client
from hanip.itxpt import mqtt_payload_parser

class StatusSubscriber(object):
    def __init__(self):
        self.config_dict = {}

        self.broker_address = "127.0.0.1"
        self.sign_status_topic = "infohub/dpi/sign/status/#"

        self.eg4_hook_available = False

        self.jsh = mqtt_payload_parser.MQTTPayloadParser(self.config_dict)
        self.mqtt_client = mqtt_client.MQTT_Client(version=311)
        self.mqtt_client.set_broker_address(self.broker_address)

        try:
            self.setup_eg4_hook()
        except ImportError:
            logging.warning("Status Subscriber: Cannot init EG4 hook")


    def setup_eg4_hook(self):
        """

        """
        from __main__ import G4_CONSOLE
        logging.info("G4: Initialising")
        self.eg4 = G4_CONSOLE()
        self.eg4_hook_available = True


    def parse_payload(self, payload):
        """
        This is what the MQTT status payload looks like:

        self.statusDict = {
            "activeStateID": None,
            "lastupdate": lastUpdate,
            "status": {
                "uptime": self.getSystemUptime(),
                "ecoEnabled": ecoStatus,
                "status": short_status,
                "ext_status": ext_status,
                "hw_details": self.hw_dict,
            },
            "extensions": self.config_dict,
        }

        """
        payload = self.jsh.parseJSON(self.mqtt_client.payload)
        if payload == 1:
            logging.warning("Status Subscriber: JSON error")
        else:
            try:
                sign_address = payload["status"]["hw_details"]["address"]
                sign_short_status = payload["status"]["status"]
                sign_extended_status = payload["status"]["ext_status"]
            except KeyError:
                pass
            else:
                logging.debug(sign_address)
                logging.debug(sign_short_status)
                logging.debug(sign_extended_status)

                if self.eg4_hook_available:
                    self.eg4.process_sign_status(sign_address, sign_short_status, sign_extended_status)


    def run(self):
        """
        Main loop
        """
        if self.mqtt_client.connect_client():
            self.mqtt_client.subscribe_to_topics([(self.sign_status_topic, 0)])
            _thread.start_new_thread(self.mqtt_client.run_client, ())

        while 1:
            if self.mqtt_client.newMsg:
                self.mqtt_client.newMsg = False
                self.parse_payload(self.mqtt_client.payload)

            time.sleep(0.01)



if __name__ == "__main__":
    logging.basicConfig(level=logging.DEBUG)

    ss = StatusSubscriber()
    ss.run()
