// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Use the <code>chrome.gcdPrivate</code> API to discover GCD APIs and register
// them.
namespace gcdPrivate {

  enum SetupType { mdns, wifi, cloud };

  // Represents a GCD device discovered locally or registered to a given user.
  dictionary GCDDevice {
    // Opaque device identifier to be passed to API.
    DOMString deviceId;

    // How this device was discovered.
    SetupType setupType;

    // Cloud identifier string.
    DOMString? cloudId;

    // Device type (camera, printer, etc)
    DOMString deviceType;

    // Device human readable name.
    DOMString deviceName;

    // Device human readable description.
    DOMString deviceDescription;
  };

  callback CloudDeviceListCallback = void(GCDDevice[] devices);

  // |commandDefinitions| : Is "commandDefs" value of device described at
  // https://developers.google.com/cloud-devices/v1/reference/devices
  // TODO(vitalybuka): consider to describe object in IDL.
  callback CommandDefinitionsCallback = void(object commandDefinitions);

  // |command| : Described at
  // https://developers.google.com/cloud-devices/v1/reference/commands
  // TODO(vitalybuka): consider to describe object in IDL.
  callback CommandCallback = void(object command);

  // |commands| : Array of commands described at
  // https://developers.google.com/cloud-devices/v1/reference/commands
  // TODO(vitalybuka): consider to describe object in IDL.
  callback CommandListCallback = void(object[] commands);

  interface Functions {
    // Returns the list of cloud devices visible locally or available in the
    // cloud for user account.
    static void getCloudDeviceList(CloudDeviceListCallback callback);

    // Queries network for local devices. Triggers an onDeviceStateChanged and
    // onDeviceRemoved events. Call this function *only* after registering for
    // onDeviceStateChanged and onDeviceRemoved events, or it will do nothing.
    static void queryForNewLocalDevices();

    // Starts device setup process. Returns id of setup process. Id should be
    // used as |setupId| in all subsequent setup related calls, and for
    // filtering setup events.
    static long startSetup(DOMString deviceId);

    // Sets WiFi network as reply to |onGetWifiNetworks| event.
    // |setupId| : The value returned by |startSetup|.
    // |network| : The wifi network for device setup.
    static void setWiFiNetwork(long setupId, DOMString network);

    // Sets WiFi network password as reply to |onGetWifiPassword| event.
    // |setupId| : The value returned by |startSetup|.
    // |password| : The password for network selected with |setWiFiNetwork|.
    static void setWiFiPassword(long setupId, DOMString password);

    // Confirms that security code known to application match to the code known
    // to device.
    // |setupId| : The value returned by |startSetup|.
    static void confirmCode(long setupId);

    // Stops registration process.
    // This call triggers |onSetupError| event. App should wait this even before
    // starting new registration.
    // |setupId| : The value returned by |startSetup|.
    static void stopSetup(long setupId);

    // Returns command definitions.
    // |deviceId| : The device to get command definitions for.
    // |callback| : The result callback.
    static void getCommandDefinitions(DOMString deviceId,
                                      CommandDefinitionsCallback callback);

    // Creates and sends a new command.
    // |deviceId| : The device to send the command to.
    // |expireInMs| : The number of milliseconds since now before the command
    // expires. Expired command should not be executed by device. Acceptable
    // values are 10000 to 2592000000, inclusive. All values outside that range
    // will be replaced by 2592000000.
    // |command| : Described at
    // https://developers.google.com/cloud-devices/v1/reference/commands
    // |callback| : The result callback.
    static void insertCommand(DOMString deviceId,
                              long expireInMs,
                              object command,
                              CommandCallback callback);

    // Returns a particular command.
    // |commandId| : Unique command ID.
    // |callback| : The result callback.
    static void getCommand(DOMString commandId, CommandCallback callback);

    // Cancels a command.
    // |commandId| : Unique command ID.
    // |callback| : The result callback.
    static void cancelCommand(DOMString commandId, CommandCallback callback);

    // Lists all commands in order of creation.
    // |deviceId| : The device to get the commands for.
    // |byUser| : List all the commands issued by the user. Special value 'me'
    // can be used to list by the current user.
    // |state| : Command state.
    // |callback| : The result callback.
    static void getCommandsList(DOMString deviceId,
                                DOMString byUser,
                                DOMString state,
                                CommandListCallback callback);
  };

  interface Events {
    // Subscribe to this event to start listening new or updated devices. New
    // listeners will get called with all known devices on the network, and
    // status updates for devices available through the cloud.
    static void onDeviceStateChanged(GCDDevice device);

    // Notifies that device has disappeared.
    // |deviceId| : The device has disappeared.
    static void onDeviceRemoved(DOMString deviceId);

    // Notifies app that setup is waiting for a wifi network. App should reply
    // with |setWiFiNetwork|.
    // |setupId| : The value returned by |startSetup|.
    static void onGetWifiNetwork(long setupId);

    // Notifies app that setup is waiting for password for the network provided
    // with |setWiFiNetwork|. Even will be called if setup flow would unable to
    // get password from the system.
    // App should reply with |setWiFiPassword|.
    // |setupId| : The value returned by |startSetup|.
    static void onGetWifiPassword(long setupId);

    // Notifies app that setup is waiting for confirmation that code is the same
    // as code known to device. App should reply with |confirmCode|, or
    // |stopSetup| if code does not match.
    // |confirmationCode| : The code to confirm.
    // |setupId| : The value returned by |startSetup|.
    static void onConfirmCode(long setupId, DOMString confirmationCode);

    // Notifies app that setup is completed successfully.
    // |setupId| : The value returned by |startSetup|.
    static void onSetupSuccess(long setupId);

    // Notifies app that setup is failed or stopped.
    // |setupId| : The value returned by |startSetup|.
    static void onSetupError(long setupId);
  };
};
