import json
import os
from pathlib import Path


class AttrDict(dict):
    """Allows attributes to be bound to and also behaves like a dict"""

    def __getattr__(self, attr):
        try:
            return self[attr]
        except KeyError:
            raise AttributeError(r"'AttrDict' object has no attribute '%s'" % attr)

    def __setattr__(self, attr, value):
        self[attr] = value


class ConfigStore(AttrDict):

    _save_file = Path(os.path.expanduser("~/.picktrue-config.json"))

    @classmethod
    def from_config_file(cls):
        path = Path(cls._save_file)
        if not os.path.exists(path):
            return cls()
        with open(path, "rb") as f:
            return cls(**json.load(f))

    def __setattr__(self, key, value):
        super(ConfigStore, self).__setattr__(key, value)
        self._save()

    def _save(self):
        path = Path(self._save_file)
        with open(path, "w") as f:
            json.dump(self, f)

    def op_store_path(self, name, path):
        path = Path(path)
        self[name] = str(path)
        self._save()

    def op_read_path(self, name):
        path = self.get(name, None)
        return Path(path) if path is not None else None


config_store = ConfigStore.from_config_file()