from buildman.enums import BuildJobResult
from util.cloudwatch import get_queue


class BuildReporter(object):
  """
  Base class for reporting build statuses to a metrics service.
  """
  def report_completion_status(self, status):
    """
    Method to invoke the recording of build's completion status to a metric service.
    """
    raise NotImplementedError


class NullReporter(BuildReporter):
  """
  The /dev/null of BuildReporters.
  """
  def report_completion_status(self, *args):
    pass


class CloudWatchBuildReporter(BuildReporter):
  """
  Implements a BuildReporter for Amazon's CloudWatch.
  """
  def __init__(self, queue, namespace_name, completed_name, failed_name, incompleted_name):
    self._queue = queue
    self._namespace_name = namespace_name
    self._completed_name = completed_name
    self._failed_name = failed_name
    self._incompleted_name = incompleted_name

  def _send_to_queue(self, *args, **kwargs):
    self._queue.put((args, kwargs))

  def report_completion_status(self, status):
    if status == BuildJobResult.COMPLETE:
      status_name = self._completed_name
    elif status == BuildJobResult.ERROR:
      status_name = self._failed_name
    elif status == BuildJobResult.INCOMPLETE:
      status_name = self._incompleted_name
    else:
      return

    self._send_to_queue(self._namespace_name, status_name, 1, unit='Count')


class BuildMetrics(object):
  """
  BuildMetrics initializes a reporter for recording the status of build completions.
  """
  def __init__(self, app=None):
    self._app = app
    self._reporter = NullReporter()
    if app is not None:
      reporter_type = app.config.get('BUILD_METRICS_TYPE', 'Null')
      if reporter_type == 'CloudWatch':
        namespace = app.config['BUILD_METRICS_NAMESPACE']
        completed_name = app.config['BUILD_METRICS_COMPLETED_NAME']
        failed_name = app.config['BUILD_METRICS_FAILED_NAME']
        incompleted_name = app.config['BUILD_METRICS_INCOMPLETED_NAME']
        request_queue = get_queue(app)
        self._reporter = CloudWatchBuildReporter(request_queue, namespace, completed_name,
                                                 failed_name, incompleted_name)

  def __getattr__(self, name):
    return getattr(self._reporter, name, None)