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


"""This module provides the information of Chameleon board."""


import collections
import logging


# Mapping from Chameleon MAC address to other information including
# bluetooth MAC address on audio board.
ChameleonInfo = collections.namedtuple(
        'ChameleonInfo', ['bluetooth_mac_address'])

_CHAMELEON_BOARD_INFO = {
        '94:eb:2c:00:00:fb': ChameleonInfo('00:1F:84:01:03:68'),
        '94:eb:2c:00:00:f9': ChameleonInfo('00:1F:84:01:03:73'),
        '94:eb:2c:00:01:25': ChameleonInfo('00:1F:84:01:03:4F'),
        '94:eb:2c:00:01:27': ChameleonInfo('00:1F:84:01:03:5B'),
        '94:eb:2c:00:01:28': ChameleonInfo('00:1F:84:01:03:46'),
        '94:eb:2c:00:01:29': ChameleonInfo('00:1F:84:01:03:26'),
        '94:eb:2c:00:01:2b': ChameleonInfo('00:1F:84:01:03:5E'),
        '94:eb:2c:00:01:2d': ChameleonInfo('00:1F:84:01:03:B6'),
        '94:eb:2c:00:01:30': ChameleonInfo('00:1F:84:01:03:2F'),
        '94:eb:2c:00:01:3a': ChameleonInfo('00:1F:84:01:03:42'),
        '94:eb:2c:00:01:3b': ChameleonInfo('00:1F:84:01:03:44'),
        '94:eb:2c:00:01:3d': ChameleonInfo('00:1F:84:01:03:59'),
        '94:eb:2c:00:01:3e': ChameleonInfo('00:1F:84:01:03:74'),
        '94:eb:2c:00:01:3f': ChameleonInfo('00:1F:84:01:03:8C'),
        '94:eb:2c:00:01:41': ChameleonInfo('00:1F:84:01:03:B3'),
        '94:eb:2c:10:06:65': ChameleonInfo('00:1F:84:01:03:6A'),
        '94:eb:2c:10:06:66': ChameleonInfo('00:1F:84:01:03:21'),
        '94:eb:2c:10:06:67': ChameleonInfo('00:1F:84:01:03:38'),
        '94:eb:2c:10:06:68': ChameleonInfo('00:1F:84:01:03:52'),
        '94:eb:2c:10:06:6c': ChameleonInfo('00:1F:84:01:03:2E'),
        '94:eb:2c:10:06:6d': ChameleonInfo('00:1F:84:01:03:84'),
        '94:eb:2c:10:06:6e': ChameleonInfo('00:1F:84:01:03:98'),
        '94:eb:2c:10:06:72': ChameleonInfo('00:1F:84:01:03:61'),
        '94:eb:2c:10:06:73': ChameleonInfo('00:1F:84:01:03:2C'),
        '94:eb:2c:10:06:76': ChameleonInfo('00:1F:84:01:03:83'),
        '94:eb:2c:10:06:7a': ChameleonInfo('00:1F:84:01:03:1C'),
        '94:eb:2c:10:06:7b': ChameleonInfo('00:1F:84:01:03:A7'),
        '94:eb:2c:10:06:7c': ChameleonInfo('00:1F:84:01:03:4B'),
        '94:eb:2c:10:06:7d': ChameleonInfo('00:1F:81:88:88:9D'),
        '94:eb:2c:10:06:7e': ChameleonInfo('00:1F:81:88:88:91'),
        '94:eb:2c:10:06:7f': ChameleonInfo('00:1F:84:01:03:36'),
        '94:eb:2c:00:01:26': ChameleonInfo('00:1F:84:01:03:56'),
        '94:eb:2c:00:01:17': ChameleonInfo('00:1F:84:01:03:76'),
        '94:eb:2c:00:01:31': ChameleonInfo('00:1F:84:01:03:20'),
        '94:eb:2c:00:01:18': ChameleonInfo('00:1F:84:01:03:A1'),
        '94:eb:2c:10:06:84': ChameleonInfo('00:1F:84:01:03:32'),

        # TODO (rjahagir@): Verify the addresses listed above as
        # as many were reworked/relocated. Some are duplicates.
        # Listed below are added as of 4/13/17.
        '94:eb:2c:10:06:74': ChameleonInfo('00:1F:84:01:03:88'),
        '94:eb:2c:10:06:a9': ChameleonInfo('00:1F:84:01:03:6C'),
        '94:eb:2c:10:06:89': ChameleonInfo('00:1F:84:01:03:40'),
        '94:eb:2c:10:06:a3': ChameleonInfo('00:1F:84:01:03:24'),
        '94:eb:2c:10:06:99': ChameleonInfo('00:1F:84:01:03:93'),
        '94:eb:2c:10:06:9a': ChameleonInfo('00:1F:84:01:03:B1'),
        '94:eb:2c:10:06:90': ChameleonInfo('00:1F:84:01:03:6E'),
        '94:eb:2c:00:01:00': ChameleonInfo('00:1F:84:01:03:54'),
        '94:eb:2c:00:01:01': ChameleonInfo('00:1F:84:01:03:3E'),
        '94:eb:2c:10:06:9e': ChameleonInfo('00:1F:84:01:03:97'),
        '94:eb:2c:10:06:9f': ChameleonInfo('00:1F:84:01:03:49'),

        # Listed below added as of 5/12/17.
        '94:eb:2c:10:06:98': ChameleonInfo('00:1F:84:01:03:65'),
        '94:eb:2c:00:01:19': ChameleonInfo('00:1F:84:01:03:91'),
        '94:eb:2c:10:06:8a': ChameleonInfo('00:1F:84:01:03:AB'),
        '94:eb:2c:00:01:1d': ChameleonInfo('00:1F:84:01:03:A6'),
        '94:eb:2c:10:06:95': ChameleonInfo('00:1F:84:01:03:66'),

        # Lars device changed as of 10/17/17.
        '94:eb:2c:00:01:1a': ChameleonInfo('00:1F:84:01:03:20')
}

class ChameleonInfoError(Exception):
    """Error in chameleon_info."""
    pass


def get_bluetooth_mac_address(chameleon_board):
    """Gets bluetooth MAC address of a ChameleonBoard.

    @param chameleon_board: A ChameleonBoard object.

    @returns: A string for bluetooth MAC address of bluetooth module on the
              audio board.

    @raises: ChameleonInfoError if bluetooth MAC address of this Chameleon
             board can not be found.

    """
    chameleon_mac_address = chameleon_board.get_mac_address().lower()
    if chameleon_mac_address not in _CHAMELEON_BOARD_INFO:
        raise ChameleonInfoError(
                'Chameleon info not found for %s' % chameleon_mac_address)
    board_info = _CHAMELEON_BOARD_INFO[chameleon_mac_address]
    logging.debug('Chameleon board info: %r', board_info)
    return board_info.bluetooth_mac_address
