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

"""Module contains a simple client lib to the devices RPC."""

import json
import logging
import urllib2

import common
from fake_device_server.client_lib import common_client
from fake_device_server import devices as s_devices


class DevicesClient(common_client.CommonClient):
    """Client library for devices method."""

    def __init__(self, *args, **kwargs):
        common_client.CommonClient.__init__(
                self, s_devices.DEVICES_PATH, *args, **kwargs)


    def get_device(self, device_id):
        """Returns info about the given |device_id|.

        @param device_id: valid device_id.
        """
        request = urllib2.Request(self.get_url([device_id]),
                                  headers=self.add_auth_headers())
        url_h = urllib2.urlopen(request)
        return json.loads(url_h.read())


    def list_devices(self):
        """Returns the list of the devices the server currently knows about."""
        request = urllib2.Request(self.get_url(),
                                  headers=self.add_auth_headers())
        url_h = urllib2.urlopen(request)
        return json.loads(url_h.read())


    def create_device(self, system_name, channel, **kwargs):
        """Creates a device using the args.

        @param system_name: name to give the system.
        @param channel: supported communication channel.
        @param kwargs: additional dictionary of args to put in config.
        """
        data = dict(name=system_name,
                    channel=channel,
                    **kwargs)
        headers = self.add_auth_headers({'Content-Type': 'application/json'})
        request = urllib2.Request(self.get_url(), json.dumps(data),
                                  headers=headers)
        url_h = urllib2.urlopen(request)
        return json.loads(url_h.read())
