#!/usr/bin/env python3
import time
import mqtt_service as mqtt
import datetime
import traceback
from enum import Enum
import logging
import signal
logger = logging.getLogger(__name__)

class StopRequestState(Enum):
    INIT = 1
    INACTIVE = 2
    ACTIVE = 3

class stopRequestStateMonitoringService(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 = "stop_request/request"
        else:
            self.topic = customerID + "/" + VIN + "/hanover/stop_request/request"

        self.mqttService = mqtt.mqttService("mqtt-monitoring-stop-request-state-service",
                                            broker    = broker,
                                            port      = port,
                                            user_name = user_name,
                                            password  = password)
        
        self.stop_request_state_dictionary = {
            "atDateTime":        "",
            "lastChangedAt":         "",
            "active":            False
        }

        self.stop_request_state = StopRequestState.INIT
    
    def setState(self, state) -> bool:
        if state != self.stop_request_state:
            self.stop_request_state = state
            if self.stop_request_state == StopRequestState.INACTIVE:
                self.stop_request_state_dictionary["active"] = False
            elif self.stop_request_state == StopRequestState.ACTIVE:
                self.stop_request_state_dictionary["active"] = True
            self.stop_request_state_dictionary["lastChangedAt"] = datetime.datetime.now().astimezone().replace(microsecond=0).isoformat()
            return True
        else:
            return False

    def publish(self):
        # only publish a valid stop request state once retrieved, not the initial state
        if self.stop_request_state_dictionary["lastChangedAt"] != "":
            self.stop_request_state_dictionary["atDateTime"] = datetime.datetime.now().astimezone().replace(microsecond=0).isoformat()
            logger.debug(f"publish - {self.topic}\n{self.stop_request_state_dictionary}\n")
            self.mqttService.publish(self.topic, self.stop_request_state_dictionary)

if __name__ == "__main__":
    print("Stop Request State Monitoring Service running in foreground")

    #use local broker to forward topics
    srMonService = stopRequestStateMonitoringService()
    
    srMonService.setState(StopRequestState.ACTIVE)
    srMonService.setState(StopRequestState.INACTIVE)

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

    while 1:
        srMonService.publish()
        time.sleep(5)
