declare module "windows.devices.lights" {
  export class Color {
    constructor();
  }

  export class Vector3 {
    x: Number;
    y: Number;
    z: Number;
    constructor();
  }

  export enum LampArrayKind {
    undefined,
    keyboard,
    mouse,
    gameController,
    peripheral,
    scene,
    notification,
    chassis,
    wearable,
    furniture,
    art,
  }

  export enum LampPurposes {
    undefined,
    control,
    accent,
    branding,
    status,
    illumination,
    presentation,
  }

  export class Lamp {
    isEnabled: Boolean;
    color: Object;
    brightnessLevel: Number;
    deviceId: String;
    isColorSettable: Boolean;
    constructor();

    static fromIdAsync(deviceId: String, callback: (error: Error, result: Lamp) => void): void ;


    static getDefaultAsync(callback: (error: Error, result: Lamp) => void): void ;


    static getDeviceSelector(): String;


    close(): void;
    addListener(type: "AvailabilityChanged", listener: (ev: Event) => void): void ;
    removeListener(type: "AvailabilityChanged", listener: (ev: Event) => void): void ;
    on(type: "AvailabilityChanged", listener: (ev: Event) => void): void ;
    off(type: "AvailabilityChanged", 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 LampArray {
    isEnabled: Boolean;
    brightnessLevel: Number;
    boundingBox: Vector3;
    deviceId: String;
    hardwareProductId: Number;
    hardwareVendorId: Number;
    hardwareVersion: Number;
    isConnected: Boolean;
    lampArrayKind: LampArrayKind;
    lampCount: Number;
    minUpdateInterval: Number;
    supportsVirtualKeys: Boolean;
    constructor();

    static fromIdAsync(deviceId: String, callback: (error: Error, result: LampArray) => void): void ;


    static getDeviceSelector(): String;


    sendMessageAsync(messageId: Number, message: Object, callback: (error: Error) => void): void ;

    requestMessageAsync(messageId: Number, callback: (error: Error, result: Object) => void): void ;

    getLampInfo(lampIndex: Number): LampInfo;

    getIndicesForKey(key: Number): Array<Number>;

    getIndicesForPurposes(purposes: LampPurposes): Array<Number>;

    setColor(desiredColor: Object): void;

    setColorForIndex(lampIndex: Number, desiredColor: Object): void;

    setSingleColorForIndices(desiredColor: Object, lampIndexes: Array<Number>): void;

    setColorsForIndices(desiredColors: Array<Object>, lampIndexes: Array<Number>): void;

    setColorsForKey(desiredColor: Object, key: Number): void;

    setColorsForKeys(desiredColors: Array<Object>, keys: Array<Number>): void;

    setColorsForPurposes(desiredColor: Object, purposes: LampPurposes): void;

  }

  export class LampAvailabilityChangedEventArgs {
    isAvailable: Boolean;
    constructor();

  }

  export class LampInfo {
    blueLevelCount: Number;
    fixedColor: Object;
    gainLevelCount: Number;
    greenLevelCount: Number;
    index: Number;
    position: Vector3;
    purposes: LampPurposes;
    redLevelCount: Number;
    updateLatency: Number;
    constructor();

    getNearestSupportedColor(desiredColor: Object): Object;

  }

}



