from core.Errors import UnknownConnectionTypeError
from core.models.Configuration import Configuration
from datetime import datetime, timezone
from typing import Optional


class ConfigurationController:

    @staticmethod
    def get():
        return Configuration.get()

    @staticmethod
    def get_or_new():

        configuration = ConfigurationController.get()

        if configuration is None:
            return Configuration()

        return configuration

    @staticmethod
    def get_connection():

        configuration = ConfigurationController.get()

        if configuration is None or configuration.connection not in ('system', 'tor'):
            raise UnknownConnectionTypeError('The preferred connection type could not be determined.')

        return configuration.connection

    @staticmethod
    def set_connection(connection: Optional[str] = None):

        configuration = ConfigurationController.get_or_new()
        configuration.connection = connection
        configuration.save(configuration)

    @staticmethod
    def get_auto_sync_enabled():

        configuration = ConfigurationController.get()

        if configuration is None:
            return False

        return configuration.auto_sync_enabled

    @staticmethod
    def set_auto_sync_enabled(enable_auto_sync: Optional[bool] = None):

        configuration = ConfigurationController.get_or_new()
        configuration.auto_sync_enabled = enable_auto_sync
        configuration.save(configuration)

    @staticmethod
    def get_last_synced_at():

        configuration = ConfigurationController.get()

        if configuration is None:
            return None

        return configuration.last_synced_at

    @staticmethod
    def update_last_synced_at():

        configuration = ConfigurationController.get_or_new()
        configuration.last_synced_at = datetime.now(timezone.utc)
        Configuration.save(configuration)

    @staticmethod
    def update_or_create(configuration):
        Configuration.save(configuration)