# Copyright (c) 2013 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.

"""Configure cellular data emulation setup."""
import time

import common
from autotest_lib.client.cros.cellular import base_station_8960
from autotest_lib.client.cros.cellular import base_station_pxt
from autotest_lib.client.cros.cellular import cellular_logging
from autotest_lib.client.cros.cellular import ether_io_rf_switch
from autotest_lib.client.cros.cellular import prologix_scpi_driver, scpi

log = cellular_logging.SetupCellularLogging('emulator_config')


class Error(Exception):
    pass

# TODO(byronk): Move this to the base_station_interface file or factory file
def _BaseStationFactory(c, technology):
    """Create a base station from a base station labconfig dictionary."""

    adapter = c['gpib_adapter']
    #TODO(byronk): get rid of the legacy single letter variable names
    s = scpi.Scpi(
        prologix_scpi_driver.PrologixScpiDriver(
            hostname=adapter['address'],
            port=adapter['ip_port'],
            gpib_address=adapter['gpib_address']),
        opc_on_stanza=True)
    if technology == 'Technology:LTE':
        return base_station_pxt.BaseStationPxt(s)
    else:
        return base_station_8960.BaseStation8960(s)


# TODO(byronk): Make this a factory class, move to a better file
def _CreateRfSwitch(config):
    if 'rf_switch' not in config.cell:
        return None
    switch_config = config.cell['rf_switch']
    if switch_config['type'] != 'ether_io':
        raise KeyError('Could not configure switch of type %s' %
                       switch_config['type'])
    return ether_io_rf_switch.RfSwitch(switch_config['address'])


def StartDefault(config, technology):
    """Set up a base station and turn it on.  Return BS and verifier."""
    # TODO(byronk): Stop using strings here. Config class? enum?
    call_box_name_part = '8960'
    if 'LTE' in technology:
        call_box_name_part = 'pxt'

    bs = None
    # Find the first matching base station. Only a problem when we go to 3.
    # TODO(byronk):This should be in the factory part
    for cfg in config.cell['basestations']:
        tp = cfg['type']
        if call_box_name_part in tp:
            bs_config = cfg
            log.info('Using this call box: %s ', cfg)
            break
    if bs_config is None:
        raise Error(
            'None of these base stations support %s:  %s' %
            (technology, config.cell['basestations']))

    # Match up to the legacy names. TODO(byronk) :fix this mess
    #TODO(byronk): get rid of the legacy single letter variable names
    c = cfg
    bs = _BaseStationFactory(bs_config, technology)

    rf_switch = _CreateRfSwitch(config)
    if rf_switch:
        port = config.get_rf_switch_port()
        log.info('Changing switch port from %s to %s', rf_switch.Query(), port)
        rf_switch.SelectPort(port)

    with bs.checker_context:
        bs.SetBsNetmaskV4(c['bs_netmask'])
        bs.SetBsIpV4(*c['bs_addresses'])

        bs.SetUeIpV4(*c['ue_rf_addresses'])
        bs.SetUeDnsV4(*c['ue_dns_addresses'])

        bs.SetTechnology(technology)
        bs.SetPower(-40)
        verifier = bs.GetAirStateVerifier()
        bs.Start()

    # TODO(rochberg):  Why does this seem to be necessary?
    time.sleep(5)

    return bs, verifier
