#!/usr/bin/python

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

import pprint
import sys

import common
from autotest_lib.client.cros.networking import shill_proxy

def usage():
    """ Prints a script usage message. """
    cmd = sys.argv[0]
    print 'Usage: %s <command> [more parameters]' % cmd
    print 'Example uses:'
    print cmd, 'list - List devices and their properties.'
    print cmd, 'get-property <devname> [propname] - List device property.'
    print cmd, 'set-property <devname> <propname> <value>'
    print '     Set property on devname to value'
    return False


def set_device_property(device, property_key, value):
    """Sets a property on a device

    @param device Interface representing a device
    @param property_key string name of property
    @param value string value of property to set

    """
    shill_proxy.ShillProxy.set_dbus_property(device, property_key, value)
    return True


def print_device_properties(device, property_key):
    """Prints one or all properties on a device

    @param device Interface representing a device
    @param property_key string name of property or None

    """
    shill = shill_proxy.ShillProxy()
    if property_key is None:
        pprint.pprint(
                shill.dbus2primitive(device.GetProperties(utf8_strings=True)),
                indent=2)
    else:
        pprint.pprint({property_key:
                shill_proxy.ShillProxy.get_dbus_property(device, property_key)},
                indent=2)
    return True


def list_devices():
    """ Display detailed device information. """
    shill = shill_proxy.ShillProxy()
    for device in shill.get_devices():
        print 'Device: %s' % device.object_path
        print_device_properties(device, None)
        print
    return True


def main():
    """ Main entry point for the device script. """
    if len(sys.argv) < 2:
        return usage()

    command = sys.argv[1]

    if command == 'list':
      return list_devices()

    if len(sys.argv) > 2:
        shill = shill_proxy.ShillProxy()
        device = shill.find_object('Device', {'Name': sys.argv[2]})
        if device is None:
            print "No device named %s found" % sys.argv[2]
            return usage()

        if command == 'get-property':
            return print_device_properties(
                    device,
                    None if len(sys.argv) < 4 else sys.argv[3])

        if command == 'set-property' and len(sys.argv) == 5:
            return set_device_property(
                    device,
                    sys.argv[3],
                    sys.argv[4])

    return usage()


if __name__ == '__main__':
    if not main():
        sys.exit(1)
