from abc import ABCMeta, abstractmethod
from collections import namedtuple

from six import add_metaclass


class RepositoryAuthorizedEmail(
    namedtuple('RepositoryAuthorizedEmail', [
      'email',
      'repository_name',
      'namespace_name',
      'confirmed',
      'code',
    ])):
  """
  Tag represents a name to an image.
  :type email: string
  :type repository_name: string
  :type namespace_name: string
  :type confirmed: boolean
  :type code: string
  """

  def to_dict(self):
    return {
      'email': self.email,
      'repository': self.repository_name,
      'namespace': self.namespace_name,
      'confirmed': self.confirmed,
      'code': self.code
    }


@add_metaclass(ABCMeta)
class RepoEmailDataInterface(object):
  """
  Interface that represents all data store interactions required by a Repo Email.
  """

  @abstractmethod
  def get_email_authorized_for_repo(self, namespace_name, repository_name, email):
    """
    Returns a RepositoryAuthorizedEmail if available else None
    """

  @abstractmethod
  def create_email_authorization_for_repo(self, namespace_name, repository_name, email):
    """
    Returns the newly created repository authorized email.
    """