# Automatic storage of everything except the config
import json
import datetime


class JSONFile(dict):
    """
    Behaves like a dictionary, but automatically
    reads and writes to a JSON file (most of the time).
    """

    @staticmethod
    def readJSON(path):
        try:
            with open(path, "r") as f:
                return json.load(f)
        except FileNotFoundError:
            return {}

    @staticmethod
    def writeJSON(path, data):
        with open(path, "w") as f:
            return f.write(json.dumps(data, indent=4, default=str))

    def __init__(self, path, data=None):
        self.path = path
        if data is None:
            super(JSONFile, self).__init__(self.readJSON(self.path))
        else:
            super(JSONFile, self).__init__(data)
            self.writeJSON(self.path, data)

    def __getitem__(self, key):
        super(JSONFile, self).__init__(self.readJSON(self.path))
        return super(JSONFile, self).__getitem__(key)

    def __setitem__(self, key, value):
        data = self.readJSON(self.path)
        data[key] = value
        self.writeJSON(self.path, data)
        super(JSONFile, self).__init__(data)

    def __delitem__(self, key):
        data = self.readJSON(self.path)
        super(JSONFile, self).__init__(data)
        try:
            del data[key]
        except KeyError:
            pass
        self.writeJSON(self.path, data)
        super(JSONFile, self).__delitem__(key)

    def __str__(self):
        super(JSONFile, self).__init__(self.readJSON(self.path))
        return json.dumps(super(JSONFile, self))


class JSONStorage:
    def __init__(
        self, emails, invites, user_template, user_displayprefs, user_configuration
    ):
        self.emails = JSONFile(path=emails)
        self.invites = JSONFile(path=invites)
        self.user_template = JSONFile(path=user_template)
        self.user_displayprefs = JSONFile(path=user_displayprefs)
        self.user_configuration = JSONFile(path=user_configuration)

    def __setattr__(self, name, value):
        if hasattr(self, name):
            path = self.__dict__[name].path
            self.__dict__[name] = JSONFile(path=path, data=value)
        else:
            self.__dict__[name] = value
