from __future__ import absolute_import

try:
    import mongoengine
except ImportError as e:
    mongoengine = None

from state_machine.orm.base import BaseAdaptor


class MongoAdaptor(BaseAdaptor):

    def get_potential_state_machine_attributes(self, clazz):
        # reimplementing inspect.getmembers to swallow ConnectionError
        results = []
        for key in dir(clazz):
            try:
                value = getattr(clazz, key)
            except (AttributeError, mongoengine.MongoEngineConnectionError):
                continue
            results.append((key, value))
        results.sort()
        return results


    def extra_class_members(self, initial_state):
        return {'aasm_state': mongoengine.StringField(default=initial_state.name)}

    def update(self, document, state_name):
        document.aasm_state = state_name


def get_mongo_adaptor(original_class):
    if mongoengine is not None and issubclass(original_class, mongoengine.Document):
        return MongoAdaptor(original_class)
    return None