from abc import ABCMeta, abstractmethod
from collections import namedtuple

from six import add_metaclass


USER_FIELDS = ["uuid", "username", "email", "given_name", "family_name", "company", "location"]


class User(namedtuple("User", USER_FIELDS)):
    """
    User represents a user.
    """


@add_metaclass(ABCMeta)
class EndpointsCommonDataInterface(object):
    """
    Interface that represents all data store interactions required by the common endpoints lib.
    """

    @abstractmethod
    def get_user(self, user_uuid):
        """
        Returns the User matching the given uuid, if any or None if none.
        """

    @abstractmethod
    def get_namespace_uuid(self, namespace_name):
        """
        Returns the uuid of the Namespace with the given name, if any.
        """
