class SimpleCollection:
    """
    SimpleCollection implements a simple collection store with rudimentary disk
    persistence and all the logic required to query the store. This class can be
    extended to add or alter database functionality.
    """

    def __init__(self):
        self.documents = SimpleDocument()

    def insert_one(self, document):
        self.documents[document["_id"]] = SimpleDocument(document)
        return document["_id"]

    def find_one(self, query=None, filter=None):
        if query is None and filter is None:
            if self.documents:
                return self.documents[random.choice(list(self.documents.keys()))]
        else:
            results = self._query(query, filter)

            if len(results) > 0:
                return results[0]
        return []

    def _query(self, query, filter_function=None, limit=None):
        query_filter = QueryFilter(query)
        results = query_filter.execute_filter(self.documents, filter_function)
        return results

    def find(self, query=None, filter=None):
        return self._query(query, filter)

    def update(self, query, update):
        to_update = self._query(query)
        for item in to_update:
            for key in update:
                item[key] = update[key]
        return len(to_update)

    def count(self):
        return len(self.documents)

    def remove(self, query=None):
        count = 0
        if query is None:
            count = self.count()
            self.documents = {}
        else:
            to_delete = self._query(query)
            count = len(to_delete)
            for item in to_delete:
                del self.documents[item['_id']]
        return count

    def set(self, key, value):
        self.documents[key] = value

    def get(self, key):
        if key in self.documents:
            return self.documents[key]
        return None

    def sync(self, filepath):

        with open(filepath, "wb") as fp:
            output = {
                "meta": {
                    "timestamp": datetime.datetime.now()
                },
                "indexes": None,
                "documents": self.documents
            }
            pickle.dump(output, fp)

    def createIndex(self, index_document, options=None):
        for key in index_document:
            pass

    def _load(self, filepath):
        # TODO: Test if file exists
        try:
            with open(filepath, "rb") as fp:
                db = pickle.load(fp)
                self.documents = db["documents"]
        except:
            self.documents = {}
 def __init__(self):
     self.documents = SimpleDocument()