declare module "windows.devices.bluetooth.advertisement" {
  export enum BluetoothLEScanningMode {
    passive,
    active,
  }

  export enum BluetoothLEAdvertisementFlags {
    none,
    limitedDiscoverableMode,
    generalDiscoverableMode,
    classicNotSupported,
    dualModeControllerCapable,
    dualModeHostCapable,
  }

  export enum BluetoothLEAdvertisementType {
    connectableUndirected,
    connectableDirected,
    scannableUndirected,
    nonConnectableUndirected,
    scanResponse,
  }

  export enum BluetoothLEAdvertisementWatcherStatus {
    created,
    started,
    stopping,
    stopped,
    aborted,
  }

  export enum BluetoothLEAdvertisementPublisherStatus {
    created,
    waiting,
    started,
    stopping,
    stopped,
    aborted,
  }

  export class BluetoothLEManufacturerData {
    data: Object;
    companyId: Number;
    constructor();
    constructor(companyId: Number, data: Object);

  }

  export class BluetoothLEAdvertisementDataSection {
    dataType: Number;
    data: Object;
    constructor();
    constructor(dataType: Number, data: Object);

  }

  export class BluetoothLEAdvertisement {
    localName: String;
    flags: BluetoothLEAdvertisementFlags;
    dataSections: Object;
    manufacturerData: Object;
    serviceUuids: Object;
    constructor();

    getManufacturerDataByCompanyId(companyId: Number): Object;

    getSectionsByType(type: Number): Object;

  }

  export class BluetoothLEAdvertisementBytePattern {
    offset: Number;
    dataType: Number;
    data: Object;
    constructor();
    constructor(dataType: Number, offset: Number, data: Object);

  }

  export class BluetoothLEAdvertisementFilter {
    advertisement: BluetoothLEAdvertisement;
    bytePatterns: Object;
    constructor();

  }

  export class BluetoothLEAdvertisementWatcherStoppedEventArgs {
    error: Number;
    constructor();

  }

  export class BluetoothLEAdvertisementWatcher {
    signalStrengthFilter: Object;
    scanningMode: BluetoothLEScanningMode;
    advertisementFilter: BluetoothLEAdvertisementFilter;
    maxOutOfRangeTimeout: Number;
    maxSamplingInterval: Number;
    minOutOfRangeTimeout: Number;
    minSamplingInterval: Number;
    status: BluetoothLEAdvertisementWatcherStatus;
    constructor();
    constructor(advertisementFilter: BluetoothLEAdvertisementFilter);

    start(): void;

    stop(): void;

    addListener(type: "Received", listener: (ev: Event) => void): void ;
    removeListener(type: "Received", listener: (ev: Event) => void): void ;
    on(type: "Received", listener: (ev: Event) => void): void ;
    off(type: "Received", listener: (ev: Event) => void): void ;
    
    addListener(type: "Stopped", listener: (ev: Event) => void): void ;
    removeListener(type: "Stopped", listener: (ev: Event) => void): void ;
    on(type: "Stopped", listener: (ev: Event) => void): void ;
    off(type: "Stopped", listener: (ev: Event) => void): void ;
    
    addListener(type: string, listener: (ev: Event) => void): void ;
    removeListener(type: string, listener: (ev: Event) => void): void ;
    on(type: string, listener: (ev: Event) => void): void ;
    off(type: string, listener: (ev: Event) => void): void ;
    

  }

  export class BluetoothLEAdvertisementReceivedEventArgs {
    advertisement: BluetoothLEAdvertisement;
    advertisementType: BluetoothLEAdvertisementType;
    bluetoothAddress: Number;
    rawSignalStrengthInDBm: Number;
    timestamp: Date;
    constructor();

  }

  export class BluetoothLEAdvertisementDataTypes {
    static advertisingInterval: Number;
    static appearance: Number;
    static completeLocalName: Number;
    static completeService128BitUuids: Number;
    static completeService16BitUuids: Number;
    static completeService32BitUuids: Number;
    static flags: Number;
    static incompleteService128BitUuids: Number;
    static incompleteService16BitUuids: Number;
    static incompleteService32BitUuids: Number;
    static manufacturerSpecificData: Number;
    static publicTargetAddress: Number;
    static randomTargetAddress: Number;
    static serviceData128BitUuids: Number;
    static serviceData16BitUuids: Number;
    static serviceData32BitUuids: Number;
    static serviceSolicitation128BitUuids: Number;
    static serviceSolicitation16BitUuids: Number;
    static serviceSolicitation32BitUuids: Number;
    static shortenedLocalName: Number;
    static slaveConnectionIntervalRange: Number;
    static txPowerLevel: Number;
    constructor();

  }

  export class BluetoothLEAdvertisementPublisherStatusChangedEventArgs {
    error: Number;
    status: BluetoothLEAdvertisementPublisherStatus;
    constructor();

  }

  export class BluetoothLEAdvertisementPublisher {
    advertisement: BluetoothLEAdvertisement;
    status: BluetoothLEAdvertisementPublisherStatus;
    constructor();
    constructor(advertisement: BluetoothLEAdvertisement);

    start(): void;

    stop(): void;

    addListener(type: "StatusChanged", listener: (ev: Event) => void): void ;
    removeListener(type: "StatusChanged", listener: (ev: Event) => void): void ;
    on(type: "StatusChanged", listener: (ev: Event) => void): void ;
    off(type: "StatusChanged", listener: (ev: Event) => void): void ;
    
    addListener(type: string, listener: (ev: Event) => void): void ;
    removeListener(type: string, listener: (ev: Event) => void): void ;
    on(type: string, listener: (ev: Event) => void): void ;
    off(type: string, listener: (ev: Event) => void): void ;
    

  }

}



