#!/usr/bin/env python3
import time
import mqtt_service as mqtt
import datetime
import traceback
import select
import logging
import signal
import htc_database_access as htcdb
logger = logging.getLogger(__name__)

JOURNEY_TOPIC = "JOURNEY"
JOURNEY_TOPIC_PATH = "htc_ipc/+/export_symbols/" + JOURNEY_TOPIC

class lineInfoMonitoringService(object):
    def __init__(self, broker            = "127.0.0.1",
                       port              = 1883,
                       user_name         = "",
                       password          = "",
                       customerID        = "",
                       VIN               = "",
                ):

        def inc_level(sig, frame):
            level = logger.getEffectiveLevel()
            if level == logging.CRITICAL:
                logger.setLevel(logging.ERROR)
            elif level == logging.ERROR:
                logger.setLevel(logging.WARNING)
            elif level == logging.WARNING:
                logger.setLevel(logging.INFO)
            elif level == logging.INFO:
                logger.setLevel(logging.DEBUG)
            print(f"Set logging to {logging.getLevelName(logger.getEffectiveLevel())}")

        def dec_level(sig, frame):
            level = logger.getEffectiveLevel()
            if level == logging.NOTSET:
                logger.setLevel(logging.DEBUG)
            elif level == logging.DEBUG:
                logger.setLevel(logging.INFO)
            elif level == logging.INFO:
                logger.setLevel(logging.WARNING)
            elif level == logging.WARNING:
                logger.setLevel(logging.ERROR)
            elif level == logging.ERROR:
                logger.setLevel(logging.CRITICAL)
            print(f"Set logging to {logging.getLevelName(logger.getEffectiveLevel())}")

        signal.signal(signal.SIGUSR2, inc_level)
        signal.signal(signal.SIGUSR1, dec_level)

        if customerID == "":
            self.topic = "line_info/line"
        else:
            self.topic = customerID + "/" + VIN + "/hanover/line_info/line"

        self.mqttService = mqtt.mqttService("mqtt-monitoring-line-info-service",
                                            broker    = broker,
                                            port      = port,
                                            user_name = user_name,
                                            password  = password,
                                            callback = self.topicUpdated,
                                            service = self)
        
        self.topic_dictionary = {
            "atDateTime":           "",
            "lineCode":             "",
            "lineText":             {
                "langCode":             "en",
                "text":                 ""
            },
            "lineColour":           "",
            "additionalAttributes": {
                "key":                  "stripe",
                "value":                ""
            }
        }

        self.current_journey = ""
        self.current_line = ""
        self.current_line_name = ""
        self.current_line_colour = ""
        self.current_line_stripe = ""

        self.mqttService.subscribe(JOURNEY_TOPIC_PATH)

        self.publish()

    def topicUpdated(mqtt, self, topic, payload):
        if topic.endswith(JOURNEY_TOPIC):
            journey = payload
            self.journeyUpdated(journey)

    def journeyUpdated(self, journey):
        if self.current_journey != journey:

            self.current_journey = journey
            logger.debug(f"Got new journey, code: {self.current_journey}")

            db = htcdb.databaseAccess()
            self.current_line = db.getAttribute(self.current_journey, "LineIDRef")
            logger.debug(f"current_line: {self.current_line}")

            self.current_line_name = db.getAttribute(self.current_line, "Name")
            logger.debug(f"current_line_name: {self.current_line_name}")

            self.current_line_colour = db.getAttribute(self.current_line, "Colour")
            logger.debug(f"current_line_colour: {self.current_line_colour}")

            self.current_line_stripe = db.getAttribute(self.current_line_stripe, "Stripe")
            logger.debug(f"current_line_stripe: {self.current_line_stripe}")

            self.publish()


    def updateDictionary(self):
        self.topic_dictionary["atDateTime"] = datetime.datetime.now().astimezone().replace(microsecond=0).isoformat()
        self.topic_dictionary["lineCode"] = self.current_line

        line_text_dict = {
            "langCode":             "en",
            "text":                 self.current_line_name
        }

        self.topic_dictionary["lineText"] = line_text_dict
        self.topic_dictionary["lineColour"] = self.current_line_colour

        additional_attributes_dict = {
            "key":                  "stripe",
            "value":                ""
        }

        self.topic_dictionary["additionalAttributes"] = additional_attributes_dict


    def publish(self):
        self.updateDictionary()

        logger.debug(f"publish - {self.topic}\n{self.topic_dictionary}\n")
        self.mqttService.publish(self.topic, self.topic_dictionary)

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

    #use local broker to forward topics
    lineInfoMonService = lineInfoMonitoringService()

    #send topics direct to cloud
    #lineInfoMonService = lineInfoMonitoringService(broker            = "mqtt.ver.hanover.cloud",
    #                                               port              = 2023,
    #                                               user_name         = "1031_300",
    #                                               password          = "z3Qs38jn",
    #                                               customerID        = "1031",
    #                                               VIN               = "0")

    while 1:
        time.sleep(5)
