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

library fuchsia.bluetooth.le;

using fuchsia.bluetooth as bt;

[Deprecated = "Use ServiceData instead"]
struct ServiceDataEntry {
    bt.UuidString uuid;
    bytes data;
};

[Deprecated = "Use ManufacturerData instead"]
struct ManufacturerSpecificDataEntry {
    uint16 company_id;
    bytes data;
};

/// Represents advertising and scan response data advertised by a broadcaster or peripheral.
[Deprecated = "Use AdvertisingData instead"]
struct AdvertisingDataDeprecated {
    /// Name of the device.
    bt.DeviceName? name;

    /// The radio transmission power level reported in the advertisement.
    fuchsia.bluetooth.Int8? tx_power_level;

    /// The appearance reported in the advertisemet.
    fuchsia.bluetooth.UInt16? appearance;

    /// List of service UUIDs reported in the advertisement.
    vector<bt.UuidString>:MAX? service_uuids;

    /// Service data included in the advertisement.
    vector<ServiceDataEntry>:MAX? service_data;

    /// Manufacturer specific data entries.
    vector<ManufacturerSpecificDataEntry>:MAX? manufacturer_specific_data;

    /// Service UUIDs that were solicited in the advertisement. Peripherals can invite centrals that
    /// expose certain services to connect to them using service solicitation.
    vector<bt.UuidString>:MAX? solicited_service_uuids;

    /// URIs included in the advertising packet.
    /// These are full URIs (they are encoded/decoded automatically)
    vector<string:MAX>:MAX? uris;
};

/// Represents a remote Bluetooth Low Energy device. A RemoteDevice can represent a central,
/// broadcaster, or peripheral based on the API from which it was received.
[Deprecated = "Use Peer instead"]
struct RemoteDevice {
    /// Identifier that uniquely identifies this device on the current system.
    bt.PeerIdString identifier;

    /// Whether or not this device is connectable. Non-connectable devices are typically acting in the
    /// LE broadcaster role.
    bool connectable;

    /// The last known RSSI of this device, if known.
    fuchsia.bluetooth.Int8? rssi;

    /// Advertising data broadcast by this device if this device is a broadcaster or peripheral.
    AdvertisingDataDeprecated? advertising_data;
};

/// Filter parameters for use during a scan. A discovered peripheral or broadcaster will be reported
/// to applications only if it satisfies all of the provided filter parameters. Null fields will be
/// ignored.
[Deprecated = "Use Filter instead"]
struct ScanFilter {
    /// Filter based on advertised service UUIDs. A peripheral that advertises at least one of the
    /// entries in `service_uuids` will satisfy this filter.
    vector<bt.UuidString>:MAX? service_uuids;

    /// Filter based on service data containing one of the given UUIDs.
    vector<bt.UuidString>:MAX? service_data_uuids;

    /// Filter based on a company identifier present in the manufacturer data. If this filter parameter
    /// is set, then the advertising payload must contain manufacturer specific data with the provided
    /// company identifier to satisfy this filter.
    fuchsia.bluetooth.UInt16? manufacturer_identifier;

    /// Filter based on whether or not a device is connectable. For example, a client that is only
    /// interested in peripherals that it can connect to can set this to true. Similarly a client can
    /// scan only for braodcasters by setting this to false.
    fuchsia.bluetooth.Bool? connectable;

    /// Filter results based on a portion of the advertised device name.
    bt.DeviceName? name_substring;

    /// Filter results based on the path loss of the radio wave. A device that matches this filter must
    /// satisfy the following:
    ///   1. Radio transmission power level and received signal strength must be available for the path
    ///      loss calculation;
    ///   2. The calculated path loss value must be less than, or equal to, `max_path_loss`.
    fuchsia.bluetooth.Int8? max_path_loss;
};
