import logging

from util.cloudwatch import get_queue


logger = logging.getLogger(__name__)


class NullReporter(object):
  def report(self, *args):
    pass


class CloudWatchReporter(object):
  """ CloudWatchReporter reports work queue metrics to CloudWatch """
  def __init__(self, request_queue, namespace, need_capacity_name, build_percent_name):
    self._namespace = namespace
    self._need_capacity_name = need_capacity_name
    self._build_percent_name = build_percent_name
    self._put_metrics_queue = request_queue

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

  def report(self, currently_processing, running_count, total_count):
    logger.debug('Worker indicated %s running count and %s total count', running_count,
                 total_count)

    need_capacity_count = total_count - running_count
    self._send_to_queue(self._namespace, self._need_capacity_name, need_capacity_count,
                        unit='Count')

    building_percent = 100 if currently_processing else 0
    self._send_to_queue(self._namespace, self._build_percent_name, building_percent,
                        unit='Percent')

class QueueMetrics(object):
  """
  QueueMetrics initializes a reporter for recording metrics of work queues.
  """
  def __init__(self, app=None):
    self._app = app
    self._reporter = NullReporter()
    if app is not None:
      reporter_type = app.config.get('QUEUE_METRICS_TYPE', 'Null')
      if reporter_type == 'CloudWatch':
        namespace = app.config['QUEUE_METRICS_NAMESPACE']
        req_capacity_name = app.config['QUEUE_METRICS_CAPACITY_SHORTAGE_NAME']
        build_percent_name = app.config['QUEUE_METRICS_BUILD_PERCENT_NAME']

        request_queue = get_queue(app)
        self._reporter = CloudWatchReporter(request_queue, namespace, req_capacity_name,
                                        build_percent_name)

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