# Lint as: python2, python3
# 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.

"""Utils for webrtc-related functionality.

Note that this module is shared by both server side and client side.
Do not put something only usable in client side in this module.

"""

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import logging
import time
import uuid
import six


class AppRTCParameters(object):
    """Class to hold parameters for AppRTC webpage."""
    def __init__(self):
        """Initializes an AppRTCParameters."""
        self.debug = 'loopback'
        self.audio = {'googEchoCancellation': False,
                      'googAutoGainControl': False,
                      'googNoiseReduction': False}


    def _get_audio_parameter_string(self):
        """Converts the audio parameters into parameter string used in URL.

        @return: Audio parameter string like "audio=googEchoCancellation=False,..."

        """
        audio_params = []
        for key, value in six.iteritems(self.audio):
            audio_params.append('%s=%s' % (key, 'true' if value else 'false'))
        audio_params_str = ','.join(audio_params)
        return audio_params_str


    def get_parameter_string(self):
        """Converts the parameters into parameter string used in URL.

        @return: Parameter string used in URL.

        """
        param_str = '?debug=%s' % self.debug
        param_str += '&'
        param_str += 'audio=' + self._get_audio_parameter_string()
        return param_str


class AppRTCController(object):
    """Class to control AppRTC webpage."""

    BASE_URL = 'https://appr.tc/r/'
    WAIT_FOR_JOIN_CALL_SECS = 10
    CLICK_JOIN_BUTTON_TIMEOUT_SECS = 10

    def __init__(self, browser_facade):
        """Initializes an AppRTCController.

        @param browser_facade: A BrowserFacadeNative (for client side) or
                               BrowserFacadeAdapter (for server side).

        """
        # Only use default parameters for now. If different parameter is needed
        # we can takes an AppRTCParameters from argument.
        self.param = AppRTCParameters()
        self.browser_facade = browser_facade


    def new_apprtc_loopback_page(self):
        """Loads a AppRTC webpage in a new tab with loopback enabled."""
        room_name = str(uuid.uuid4())
        url = self.BASE_URL + room_name + self.param.get_parameter_string()
        logging.debug('Open AppRTC loopback page %s', url)
        tab_desc = self.browser_facade.new_tab(url)
        self.click_join_button(tab_desc)
        # After clicking join button, it takes some time to actually join the
        # call.
        time.sleep(self.WAIT_FOR_JOIN_CALL_SECS)


    def click_join_button(self, tab_desc):
        """Clicks 'join' button on the webpage.

        @param tab_desc: Tab descriptor returned by new_tab of browser facade.

        """
        click_button_js = """document.getElementById('confirm-join-button').click();"""
        self.browser_facade.execute_javascript(
                tab_desc, click_button_js, self.CLICK_JOIN_BUTTON_TIMEOUT_SECS)
