from core.Constants import Constants
from core.controllers.ApplicationController import ApplicationController
from core.controllers.ApplicationVersionController import ApplicationVersionController
from core.controllers.ClientVersionController import ClientVersionController
from core.controllers.ConfigurationController import ConfigurationController
from core.controllers.LocationController import LocationController
from core.controllers.SubscriptionPlanController import SubscriptionPlanController
from core.observers import ClientObserver
from core.observers.ConnectionObserver import ConnectionObserver
from os import path
from typing import Optional


class ClientController:

    @staticmethod
    def get_working_directory():

        import main
        return str(path.dirname(path.abspath(main.__file__)))

    @staticmethod
    def get_version():
        return ClientVersionController.get(Constants.CLIENT_VERSION)

    @staticmethod
    def can_be_updated():
        return not ClientVersionController.is_latest(ClientController.get_version())

    @staticmethod
    def sync(client_observer: ClientObserver = None, connection_observer: ConnectionObserver = None):

        from core.controllers.ConnectionController import ConnectionController
        ConnectionController.with_preferred_connection(task=ClientController.__sync, client_observer=client_observer, connection_observer=connection_observer)

    @staticmethod
    def __sync(client_observer: Optional[ClientObserver] = None, proxies: Optional[dict] = None):

        if client_observer is not None:
            client_observer.notify('synchronizing')

        # noinspection PyProtectedMember
        ApplicationController._sync(proxies=proxies)
        # noinspection PyProtectedMember
        ApplicationVersionController._sync(proxies=proxies)
        # noinspection PyProtectedMember
        ClientVersionController._sync(proxies=proxies)
        # noinspection PyProtectedMember
        LocationController._sync(proxies=proxies)
        # noinspection PyProtectedMember
        SubscriptionPlanController._sync(proxies=proxies)

        ConfigurationController.update_last_synced_at()