# Copyright 2014 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 logging
import time

from autotest_lib.client.common_lib import error
from autotest_lib.client.cros.networking.chrome_testing import test_utils

class ChromeNetworkProvider(object):
    """
    ChromeNetworkProvider handles all calls made to the connection
    manager by internally calling the Networking Private Extension API.

    For Example: Enable/Disable WiFi, Scan WiFi, Connect to WiFi that can
    be used to develop other tests.
    """

    WIFI_DEVICE = 'WiFi'
    SHORT_TIMEOUT = 3


    def __init__(self, cntc):
        """Initialization function for this class.

        @param cntc: Instance of type ChromeNetworkingTestContext.

        """
        self._chrome_testing = cntc


    def get_wifi_networks(self):
        """Get list of available wifi networks.

        @raises error.TestFail if no wifi networks are found.
        @return List of dictionaries containing wifi network information.

        """
        wifi_networks = self._chrome_testing.find_wifi_networks()
        if not wifi_networks:
            raise error.TestFail('No wifi networks found.')

        return wifi_networks


    def get_enabled_devices(self):
        """Get list of enabled network devices on the device.

        @return List of enabled network devices.

        """
        enabled_network_types = self._chrome_testing.call_test_function(
                test_utils.LONG_TIMEOUT,
                'getEnabledNetworkDevices')
        for key, value in enabled_network_types.items():
            if key == 'result':
                logging.info('Enabled Network Devices: %s', value)
                return value


    def disable_network_device(self, network):
        """Disable given network device.

        @param network: string name of the network device to be disabled.
                Options include 'WiFi', 'Cellular' and 'Ethernet'.

        """
        # Do ChromeOS browser session teardown/setup before disabling the
        # network device because chrome.networkingPrivate.disableNetworkType API
        # fails to disable the network device on subsequent calls if we do not
        # teardown and setup the browser session.
        self._chrome_testing.teardown()
        self._chrome_testing.setup()

        logging.info('Disabling: %s', network)
        disable_network_result = self._chrome_testing.call_test_function_async(
                'disableNetworkDevice',
                '"' + network + '"')


    def enable_network_device(self, network):
        """Enable given network device.

        @param network: string name of the network device to be enabled. Options
                include 'WiFi', 'Cellular' and 'Ethernet'.

        """
        logging.info('Enabling: %s', network)
        enable_network_result = self._chrome_testing.call_test_function_async(
                'enableNetworkDevice',
                '"' + network + '"')
        # Allow enough time for the DUT to fully transition into enabled state.
        time.sleep(self.SHORT_TIMEOUT)


    def scan_for_networks(self):
        """Scan for all the available networks"""
        self._chrome_testing.call_test_function_async('requestNetworkScan')
        # Allow enough time for Chrome to scan and get all the network SSIDs.
        time.sleep(self.SHORT_TIMEOUT)


    def connect_to_network(self, service_list):
       """Connects to the given network using networkingPrivate API.

       @param service_list: service list for the network to connect to.

       """
       connect_status = self._chrome_testing.call_test_function(
                            test_utils.LONG_TIMEOUT,
                            'connectToNetwork',
                            '"' + service_list['GUID'] +'"')

       if connect_status['status'] == 'chrome-test-call-status-failure':
           raise error.TestFail(
                     'Could not connect to %s network. Error returned by '
                     'chrome.networkingPrivate.startConnect API: %s' %
                     (service_list['Name'], connect_status['error']))
