class WorkerError(object):
  """ Helper class which represents errors raised by a build worker. """
  def __init__(self, error_code, base_message=None):
    self._error_code = error_code
    self._base_message = base_message

    self._error_handlers = {
        'io.quay.builder.buildpackissue': {
            'message': 'Could not load build package',
            'is_internal': True
        },

        'io.quay.builder.cannotextractbuildpack': {
            'message': 'Could not extract the contents of the build package'
        },

        'io.quay.builder.cannotpullforcache': {
            'message': 'Could not pull cached image',
            'is_internal': True
        },

        'io.quay.builder.cannotpullbaseimage': {
            'message': 'Could not pull base image',
            'show_base_error': True
        },

        'io.quay.builder.internalerror': {
            'message': 'An internal error occurred while building. Please submit a ticket.'
        },

        'io.quay.builder.buildrunerror': {
            'message': 'Could not start the build process',
            'is_internal': True
        },

        'io.quay.builder.builderror': {
            'message': 'A build step failed',
            'show_base_error': True
        },

        'io.quay.builder.tagissue': {
            'message': 'Could not tag built image',
            'is_internal': True
        },

        'io.quay.builder.pushissue': {
            'message': 'Could not push built image',
            'show_base_error': True,
            'is_internal': True
        },

        'io.quay.builder.dockerconnecterror': {
            'message': 'Could not connect to Docker daemon',
            'is_internal': True
        },

        'io.quay.builder.missingorinvalidargument': {
            'message': 'Missing required arguments for builder',
            'is_internal': True
        }
    }

  def is_internal_error(self):
    handler = self._error_handlers.get(self._error_code)
    return handler.get('is_internal', False) if handler else True

  def public_message(self):
    handler = self._error_handlers.get(self._error_code)
    if not handler:
      return 'An unknown error occurred'

    message = handler['message']
    if handler.get('show_base_error', False) and self._base_message:
      message = message + ': ' + self._base_message

    return message

  def extra_data(self):
    if self._base_message:
      return {
          'base_error': self._base_message
      }

    return {}
