#!/usr/bin/python3

import signal
import os

from modules.scheduling.scheduler import AuraScheduler
from modules.communication.liquidsoap.communicator import LiquidSoapCommunicator
from modules.communication.redis.adapter import ServerRedisAdapter
from modules.web.routes import Routes
from libraries.base.config import AuraConfig
from libraries.base.logger import AuraLogger

class Aura(AuraConfig, AuraLogger):
    server = None
    messenger = None
    controller = None

    # ------------------------------------------------------------------------------------------ #
    def __init__(self):
        super(Aura, self).__init__()

        server = object

#        self.controller = AuraController(self.config)
        # create scheduler and ls_communicator
        self.liquidsoapcommunicator = LiquidSoapCommunicator(self.config)
        self.scheduler = AuraScheduler(self.config)

        # give both a reference of each other
        self.liquidsoapcommunicator.scheduler = self.scheduler
        self.scheduler.liquidsoapcommunicator = self.liquidsoapcommunicator

        # create the redis adapter
        self.messenger = ServerRedisAdapter()
        self.messenger.config = self.config
        self.messenger.scheduler = self.scheduler
        self.messenger.liquidsoapcommunicator = self.liquidsoapcommunicator

        def receive_signal(signum, stack):
            print("received signal")
            server.reload()

        signal.signal(signal.SIGUSR1, receive_signal)

    def join_comm(self):
        # start listener thread
        self.messenger.start()

    def start_web_service(self):
        try:
            Routes()
        except OSError as e:
            self.messenger.halt()
            self.logger.critical("AuraEngine already running? Exception: " + e.strerror + ". Exiting...")
            os._exit(0)


# # ## ## ## ## ## # #
# # ENTRY FUNCTION # #
# # ## ## ## ## ## # #
def main():
    aura = Aura()
    aura.join_comm()
    aura.start_web_service()
# # ## ## ## ## ## ## # #
# # End ENTRY FUNCTION # #
# # ## ## ## ## ## ## # #


if __name__ == "__main__":
    main()