import buildbot
import zope
import os

from datetime import datetime, timedelta
from twisted.python import log

class ConfigEmailLookup(buildbot.util.ComparableMixin):
  """
  Email lookup implementation which searchs a user specified configuration
  file to match commit authors to email addresses.
  """

  # TODO: Document this class.
  # Class loads llvm_authors from file and reload if the file was updated.

  zope.interface.implements(buildbot.interfaces.IEmailLookup)
  compare_attrs = ["author_filename", "default_address", "only_addresses"]

  def __init__(self, author_filename, default_address, only_addresses = None, update_interval=timedelta(hours=1)):
    from ConfigParser import ConfigParser

    self.author_filename = author_filename
    self.default_address = default_address
    self.only_addresses = only_addresses
    self.update_interval = update_interval

    self.config_parser = ConfigParser()
    self.config_parser.read(self.author_filename)

    self.time_checked = datetime.utcnow()
    self.time_loaded  = datetime.utcfromtimestamp(os.path.getmtime(self.author_filename))

    if only_addresses:
      import re
      self.address_match_p = re.compile(only_addresses).match
    else:
      self.address_match_p = lambda addr: True

  def getAddress(self, name):

    # For a multiple types of pollers/schedulers we can get an email address or
    # a fully qualified name/email in 'name' parameter. Check and return name if it
    # contains email address.
    if name is not None and '@' in name:
        return name

    try:

      if (datetime.utcnow() - self.time_checked) >= timedelta(minutes=1):
        self.time_checked = datetime.utcnow()
        current_mtime = datetime.utcfromtimestamp(os.path.getmtime(self.author_filename))

        if (current_mtime != self.time_loaded) and ((datetime.utcnow() - current_mtime) >= timedelta(minutes=1)):
          # Reload the list of authors.
          self.config_parser.read(self.author_filename)
          self.time_loaded = current_mtime
          log.msg('Reloaded file %s (mtime=%s) at %s' % (self.author_filename, self.time_loaded, self.time_checked))

    except:
      log.msg('Cannot load the %s file.' % self.author_filename)
      pass

    try:
      email = self.config_parser.get("authors", name)
    except:
      return self.default_address

    if self.address_match_p(email):
      return email

    return self.default_address
