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

"""Facade to access the CFM functionality."""

import time

from autotest_lib.client.common_lib import error
from autotest_lib.client.common_lib.cros import enrollment, cfm_util


class TimeoutException(Exception):
    """Timeout Exception class."""
    pass


class CFMFacadeNative(object):
    """Facade to access the CFM functionality.

    The methods inside this class only accept Python native types.
    """
    _USER_ID = 'cfmtest@croste.tv'
    _PWD = 'test0000'
    _EXT_ID = 'ikfcpmgefdpheiiomgmhlmmkihchmdlj'
    _ENROLLMENT_DELAY = 15


    def __init__(self, resource):
        """Initializes a CFMFacadeNative.

        @param resource: A FacadeResource object.
        """
        self._resource = resource


    def enroll_device(self):
        """Enroll device into CFM."""
        self._resource.start_custom_chrome({"auto_login": False,
                                            "disable_gaia_services": False})
        enrollment.RemoraEnrollment(self._resource._browser, self._USER_ID,
                self._PWD)
        # Timeout to allow for the device to stablize and go back to the
        # login screen before proceeding.
        time.sleep(self._ENROLLMENT_DELAY)
        self.restart_chrome_for_cfm()
        self.check_hangout_extension_context()


    def restart_chrome_for_cfm(self):
        """Restart chrome with custom values for CFM."""
        custom_chrome_setup = {"clear_enterprise_policy": False,
                               "dont_override_profile": True,
                               "disable_gaia_services": False,
                               "disable_default_apps": False,
                               "auto_login": False}
        self._resource.start_custom_chrome(custom_chrome_setup)


    def check_hangout_extension_context(self):
        """Check to make sure hangout app launched.

        @raises error.TestFail if the URL checks fails.
        """
        ext_contexts = cfm_util.wait_for_kiosk_ext(
                self._resource._browser, self._EXT_ID)
        ext_urls = set([context.EvaluateJavaScript('location.href;')
                        for context in ext_contexts])
        if len(ext_urls) == 2:
            expected_urls = set(
                ['chrome-extension://' + self._EXT_ID + '/' + path
                 for path in ['hangoutswindow.html?windowid=0',
                              '_generated_background_page.html']])
        if len(ext_urls) == 3:
            expected_urls = set(
                ['chrome-extension://' + self._EXT_ID + '/' + path
                 for path in ['hangoutswindow.html?windowid=0',
                              'hangoutswindow.html?windowid=1',
                              '_generated_background_page.html']])
        if expected_urls != ext_urls:
            raise error.TestFail(
                    'Unexpected extension context urls, expected %s, got %s'
                    % (expected_urls, ext_urls))

    @property
    def _webview_context(self):
        """Get webview context object."""
        return cfm_util.get_cfm_webview_context(self._resource._browser,
                self._EXT_ID)


    def wait_for_telemetry_commands(self):
        """Wait for telemetry commands."""
        cfm_util.wait_for_telemetry_commands(self._webview_context)


    # UI commands/functions
    def wait_for_oobe_start_page(self):
        """Wait for oobe start screen to launch."""
        cfm_util.wait_for_oobe_start_page(self._webview_context)


    def skip_oobe_screen(self):
        """Skip Chromebox for Meetings oobe screen."""
        cfm_util.skip_oobe_screen(self._webview_context)


    def is_oobe_start_page(self):
        """Check if device is on CFM oobe start screen.

        @return a boolean, based on oobe start page status.
        """
        return cfm_util.is_oobe_start_page(self._webview_context)


    # Hangouts commands/functions
    def start_new_hangout_session(self, session_name):
        """Start a new hangout session.

        @param session_name: Name of the hangout session.
        """
        cfm_util.start_new_hangout_session(self._webview_context, session_name)


    def end_hangout_session(self):
        """End current hangout session."""
        cfm_util.end_hangout_session(self._webview_context)


    def is_in_hangout_session(self):
        """Check if device is in hangout session.

        @return a boolean, for hangout session state.
        """
        return cfm_util.is_in_hangout_session(self._webview_context)


    def is_ready_to_start_hangout_session(self):
        """Check if device is ready to start a new hangout session.

        @return a boolean for hangout session ready state.
        """
        return cfm_util.is_ready_to_start_hangout_session(
                self._webview_context)


    # Diagnostics commands/functions
    def is_diagnostic_run_in_progress(self):
        """Check if hotrod diagnostics is running.

        @return a boolean for diagnostic run state.
        """
        return cfm_util.is_diagnostic_run_in_progress(self._webview_context)


    def wait_for_diagnostic_run_to_complete(self):
        """Wait for hotrod diagnostics to complete."""
        cfm_util.wait_for_diagnostic_run_to_complete(self._webview_context)


    def run_diagnostics(self):
        """Run hotrod diagnostics."""
        cfm_util.run_diagnostics(self._webview_context)


    def get_last_diagnostics_results(self):
        """Get latest hotrod diagnostics results.

        @return a dict with diagnostic test results.
        """
        return cfm_util.get_last_diagnostics_results(self._webview_context)


    # Mic audio commands/functions
    def is_mic_muted(self):
        """Check if mic is muted.

        @return a boolean for mic mute state.
        """
        return cfm_util.is_mic_muted(self._webview_context)


    def mute_mic(self):
        """Local mic mute from toolbar."""
        cfm_util.mute_mic(self._webview_context)


    def unmute_mic(self):
        """Local mic unmute from toolbar."""
        cfm_util.unmute_mic(self._webview_context)


    def remote_mute_mic(self):
        """Remote mic mute request from cPanel."""
        cfm_util.remote_mute_mic(self._webview_context)


    def remote_unmute_mic(self):
        """Remote mic unmute request from cPanel."""
        cfm_util.remote_unmute_mic(self._webview_context)


    def get_mic_devices(self):
        """Get all mic devices detected by hotrod.

        @return a list of mic devices.
        """
        return cfm_util.get_mic_devices(self._webview_context)


    def get_preferred_mic(self):
        """Get mic preferred for hotrod.

        @return a str with preferred mic name.
        """
        return cfm_util.get_preferred_mic(self._webview_context)


    def set_preferred_mic(self, mic):
        """Set preferred mic for hotrod.

        @param mic: String with mic name.
        """
        cfm_util.set_preferred_mic(self._webview_context, mic)


    # Speaker commands/functions
    def get_speaker_devices(self):
        """Get all speaker devices detected by hotrod.

        @return a list of speaker devices.
        """
        return cfm_util.get_speaker_devices(self._webview_context)


    def get_preferred_speaker(self):
        """Get speaker preferred for hotrod.

        @return a str with preferred speaker name.
        """
        return cfm_util.get_preferred_speaker(self._webview_context)


    def set_preferred_speaker(self, speaker):
        """Set preferred speaker for hotrod.

        @param speaker: String with speaker name.
        """
        cfm_util.set_preferred_speaker(self._webview_context, speaker)


    def set_speaker_volume(self, volume_level):
        """Set speaker volume.

        @param volume_level: String value ranging from 0-100 to set volume to.
        """
        cfm_util.set_speaker_volume(self._webview_context, volume_level)


    def get_speaker_volume(self):
        """Get current speaker volume.

        @return a str value with speaker volume level 0-100.
        """
        return cfm_util.get_speaker_volume(self._webview_context)


    def play_test_sound(self):
        """Play test sound."""
        cfm_util.play_test_sound(self._webview_context)


    # Camera commands/functions
    def get_camera_devices(self):
        """Get all camera devices detected by hotrod.

        @return a list of camera devices.
        """
        return cfm_util.get_camera_devices(self._webview_context)


    def get_preferred_camera(self):
        """Get camera preferred for hotrod.

        @return a str with preferred camera name.
        """
        return cfm_util.get_preferred_camera(self._webview_context)


    def set_preferred_camera(self, camera):
        """Set preferred camera for hotrod.

        @param camera: String with camera name.
        """
        cfm_util.set_preferred_camera(self._webview_context, camera)


    def is_camera_muted(self):
        """Check if camera is muted (turned off).

        @return a boolean for camera muted state.
        """
        return cfm_util.is_camera_muted(self._webview_context)


    def mute_camera(self):
        """Turned camera off."""
        cfm_util.mute_camera(self._webview_context)


    def unmute_camera(self):
        """Turned camera on."""
        cfm_util.unmute_camera(self._webview_context)
