# -*- coding: utf-8 -*-
# Copyright (c) 2012 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 os

from autotest_lib.client.bin import test
from autotest_lib.client.common_lib import error
from autotest_lib.client.cros import factory_setup_modules
from cros.factory.test import factory
from cros.factory.event_log import EventLog
from cros.factory.test.test_ui import UI

_HTML_PREFIX = '''
<h1>WLAN & Bluetooth MAC address probing</h1><br>
'''
_HTML_POSTFIX = '''
<input type="button" value="Finished"
  onClick="test.pass()">
'''

WLAN_MAC_PATH = "/sys/class/net/%s/address"
BT_MAC_PATH = "/sys/class/bluetooth/%s/address"

class factory_ProbeWifi(test.test):
    version = 2

    def probe_devices(self, probe_list):
        '''Probe devices' MAC address.

        Args:
            probe_list: A list of tuples in the format:
            (type recorded in eventlog,
             device path,
             label to display in English,
             label to display in Chinese)
        '''
        display_strings = []
        for mac_type, device_path, label_en, label_zh in probe_list:
             if os.path.exists(device_path):
                 mac = open(device_path).read().strip()
                 display_string = u'Mac address of %s(%s): %s' % (
                     label_en, label_zh, mac)
                 display_strings.append(display_string)
             else:
                 raise error.TestFail(
                     '%s device %s does not exist' % (mac_type, device_path))

             factory.console.info(display_string)
             self.event_log.Log('mac', mac_type=mac_type, mac=mac)
        return display_strings

    def run_once(self, wlan_device='wlan0', bt_device='hci0', display=False):
        self.event_log = EventLog.ForAutoTest()
        self.ui = UI()
        probe_list = []
        if wlan_device:
            probe_list.append(('wlan',
                               WLAN_MAC_PATH % wlan_device,
                               u'WLAN', u'无线網路'))

        if bt_device:
            probe_list.append(('bt',
                               BT_MAC_PATH % bt_device,
                               u'Bluetooth', u'藍芽'))

        display_strings = tuple(self.probe_devices(probe_list))
        factory.log(display_strings)
        if display:
            html = _HTML_PREFIX
            for display_string in display_strings:
                html += "<h2>%s</h2><br>" % display_string
            self.ui.SetHTML(html + _HTML_POSTFIX)
            self.ui.Run()
