class BaseManager(object):
  """ Base for all worker managers. """
  def __init__(self, register_component, unregister_component, job_heartbeat_callback,
               job_complete_callback):
    self.register_component = register_component
    self.unregister_component = unregister_component
    self.job_heartbeat_callback = job_heartbeat_callback
    self.job_complete_callback = job_complete_callback

  def job_heartbeat(self, build_job):
    """ Method invoked to tell the manager that a job is still running. This method will be called
        every few minutes. """
    self.job_heartbeat_callback(build_job)

  def setup_time(self):
    """ Returns the number of seconds that the build system should wait before allowing the job
        to be picked up again after called 'schedule'.
    """
    raise NotImplementedError

  def shutdown(self):
    """ Indicates that the build controller server is in a shutdown state and that no new jobs
        or workers should be performed. Existing workers should be cleaned up once their jobs
        have completed
    """
    raise NotImplementedError

  def schedule(self, build_job, loop):
    """ Schedules a queue item to be built. Returns True if the item was properly scheduled
        and False if all workers are busy.
    """
    raise NotImplementedError

  def initialize(self):
    """ Runs any initialization code for the manager. Called once the server is in a ready state.
    """
    raise NotImplementedError

  def build_component_disposed(self, build_component, timed_out):
    """ Method invoked whenever a build component has been disposed. The timed_out boolean indicates
        whether the component's heartbeat timed out.
    """
    raise NotImplementedError

  def job_completed(self, build_job, job_status, build_component):
    """ Method invoked once a job_item has completed, in some manner. The job_status will be
        one of: incomplete, error, complete. If incomplete, the job should be requeued.
    """
    raise NotImplementedError

  def num_workers(self):
    """ Returns the number of active build workers currently registered. This includes those
        that are currently busy and awaiting more work.
    """
    raise NotImplementedError
