from json import load, dump
from os.path import exists

from pycs.observable import ObservableDict


class ApplicationStatus(ObservableDict):
    def __init__(self, path_to_settings_json=None, settings=None):
        # load settings if file exists
        self.__path_to_settings_json = path_to_settings_json

        if settings is not None:
            settings = settings
        elif path_to_settings_json is not None and exists(path_to_settings_json):
            with open(path_to_settings_json, 'r') as settings_json:
                settings = load(settings_json)
        else:
            settings = {}

        # initialize data structure
        super().__init__({
            'settings': settings,
            'models': {},
            'projects': {}
        })

        # subscribe to settings change to write it to file
        self['settings'].subscribe(self.__write_settings_to_file)

    def __write_settings_to_file(self, settings):
        with open(self.__path_to_settings_json, 'w') as settings_json:
            dump(settings, settings_json, indent=4)