# 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.

"""Class implementing a wrapper for audioproc_f.
"""

import cProfile
import logging
import os
import subprocess

from . import data_access
from . import exceptions


class AudioProcWrapper(object):
  """Wrapper for audioproc_f.
  """

  OUTPUT_FILENAME = 'output.wav'
  _AUDIOPROC_F_BIN_PATH = os.path.abspath(os.path.join(
      os.pardir, 'audioproc_f'))

  def __init__(self):
    self._config = None
    self._output_signal_filepath = None

    # Profiler instance to measure audioproc_f running time.
    self._profiler = cProfile.Profile()

  @property
  def output_filepath(self):
    return self._output_signal_filepath

  def Run(self, config_filepath, capture_input_filepath, output_path,
          render_input_filepath=None):
    """Run audioproc_f.

    Args:
      config_filepath: path to the configuration file specifing the arguments
                       for audioproc_f.
      capture_input_filepath: path to the capture audio track input file (aka
                              forward or near-end).
      output_path: path of the audio track output file.
      render_input_filepath: path to the render audio track input file (aka
                             reverse or far-end).
    """
    # Init.
    self._output_signal_filepath = os.path.join(
        output_path, self.OUTPUT_FILENAME)
    profiling_stats_filepath = os.path.join(output_path, 'profiling.stats')

    # Skip if the output has already been generated.
    if os.path.exists(self._output_signal_filepath) and os.path.exists(
        profiling_stats_filepath):
      return

    # Load configuration.
    self._config = data_access.AudioProcConfigFile.Load(config_filepath)

    # Set remaining parametrs.
    if not os.path.exists(capture_input_filepath):
      raise exceptions.FileNotFoundError('cannot find capture input file')
    self._config['-i'] = capture_input_filepath
    self._config['-o'] = self._output_signal_filepath
    if render_input_filepath is not None:
      if not os.path.exists(render_input_filepath):
        raise exceptions.FileNotFoundError('cannot find render input file')
      self._config['-ri'] = render_input_filepath

    # Build arguments list.
    args = [self._AUDIOPROC_F_BIN_PATH]
    for param_name in self._config:
      args.append(param_name)
      if self._config[param_name] is not None:
        args.append(str(self._config[param_name]))
    logging.debug(' '.join(args))

    # Run.
    self._profiler.enable()
    subprocess.call(args)
    self._profiler.disable()

    # Save profiling stats.
    self._profiler.dump_stats(profiling_stats_filepath)
