# Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.

"""EvaluationScore factory class.
"""

import logging

from . import exceptions
from . import eval_scores


class EvaluationScoreWorkerFactory(object):
  """Factory class used to instantiate evaluation score workers.

  The ctor gets the parametrs that are used to instatiate the evaluation score
  workers.
  """

  def __init__(self, polqa_tool_bin_path, echo_metric_tool_bin_path):
    self._score_filename_prefix = None
    self._polqa_tool_bin_path = polqa_tool_bin_path
    self._echo_metric_tool_bin_path = echo_metric_tool_bin_path

  def SetScoreFilenamePrefix(self, prefix):
    self._score_filename_prefix = prefix

  def GetInstance(self, evaluation_score_class):
    """Creates an EvaluationScore instance given a class object.

    Args:
      evaluation_score_class: EvaluationScore class object (not an instance).

    Returns:
      An EvaluationScore instance.
    """
    if self._score_filename_prefix is None:
      raise exceptions.InitializationException(
          'The score file name prefix for evaluation score workers is not set')
    logging.debug(
        'factory producing a %s evaluation score', evaluation_score_class)

    if evaluation_score_class == eval_scores.PolqaScore:
      return eval_scores.PolqaScore(
          self._score_filename_prefix, self._polqa_tool_bin_path)
    elif evaluation_score_class == eval_scores.EchoMetric:
      return eval_scores.EchoMetric(
          self._score_filename_prefix, self._echo_metric_tool_bin_path)
    else:
      return evaluation_score_class(self._score_filename_prefix)
