# functionality
from bot import main
from clock import cin, cout
from dashboard import dout

import persistence.main

# various
import logging
from threading import Thread
import os


if os.name == "nt":
    logging.basicConfig(
        format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO
    )
else:
    logging.basicConfig(
        format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
        level=logging.INFO,
        filename='persistence/complete.log',
    )


class Launcher:
    """Launches all other submodules"""

    def __init__(self):
        """"""
        self.persistence = persistence.main.PersistentDict("persistence/prst.json")
        self.logger = logging.getLogger(__name__)
        self.logger.info("Launcher initialized")

        if len(self.persistence) == 0:
            self.init_persistence()
        self.persistence["global"]["reboots"] += 1

        self.clock_module = cout.ClockFace(prst=self.persistence)
        self.bot_module = main.ChatBot(name="Norbit", version="3.0a", prst=self.persistence)
        self.dashboard_module = dout.DashBoard(host_ip="0.0.0.0", prst=self.persistence)
        self.sensors = cin.SensorReadout(prst=self.persistence)

        self.modules = {
            "sensors" : self.sensors,
            "bot" : self.bot_module,
            "clock" : self.clock_module,
            "dashboard" : self.dashboard_module,
        }

        for module in self.modules.values():
            self.logger.info("Starting module "+ module.__class__.__name__)
            module.modules = self.modules
            module.start()
        

    def init_persistence(self):
        self.logger.warning("No persistence found, created a new one")

        self.persistence["bot"] =  {
            "send_activity" : {"hour":[], "count":[]},
            "receive_activity" : {"hour":[], "count":[]},
            "execute_activity" : {"hour":[], "count":[]},
            "log": [],
            "chat_members": {},
            "aliases" : {}
        }
        self.persistence["clock"] = {
            "sensors" : {
                "time" : [],
                "temperature":[],
                "humidity":[],
                "brightness" : [],
                }
        }
        self.persistence["dashboard"] = {}
        self.persistence["global"] = {
            "lists" : {},
            "reboots": 0
            }


########################################################################
## Aand liftoff!
Launcher()