# Copyright 2016 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import common
from autotest_lib.client.common_lib import error
from autotest_lib.server import site_utils


_AVAILABLE_AUDIO_CLIENTS = set(('loop', 'interactive'))


def _get_client(fb_client_name, available_clients, test_name, machine,
                args_str):
    """Instantiates a feedback client.

    @param fb_client_name: Name of the desired client.
    @param available_clients: Set of available client names to choose from.
    @param test_name: The name of the test.
    @param machine: A dictionary describing the test host and DUT.
    @param args_str: String containing comma-separate, implementation-specific
                     arguments.

    @return An instance of client.common_lib.feedback.client.Client.

    @raise error.TestError: Requested client is invalid/unavailable/unknown.
    """
    if not fb_client_name:
        raise error.TestError('Feedback client name is empty')
    if fb_client_name not in available_clients:
        raise error.TestError(
                'Feedback client (%s) is unknown or unavailble for this test' %
                fb_client_name)

    hostname = site_utils.get_hostname_from_machine(machine)
    afe_host = site_utils.get_afe_host_from_machine(machine)
    serials = afe_host.attributes.get('serials')
    dut_name = '%s-%s' % (hostname, serials)
    args = args_str.split(',') if args_str else []

    if fb_client_name == 'loop':
        from autotest_lib.server.brillo.feedback import closed_loop_audio_client
        return closed_loop_audio_client.Client(*args)
    elif fb_client_name == 'interactive':
        from autotest_lib.client.common_lib.feedback import tester_feedback_client
        return tester_feedback_client.Client(test_name, dut_name, *args)
    else:
        raise error.TestError(
                'Feedback client (%s) unknown despite being listed as '
                'available for this test' % fb_client_name)


def get_audio_client(fb_client_name, test_name, machine, args_str):
    """Instantiates an audio feedback client."""
    return _get_client(fb_client_name, _AVAILABLE_AUDIO_CLIENTS, test_name,
                       machine, args_str)
