/*
 * Copyright (c) 2025 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License"),
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @file
 * @kit MultimodalAwarenessKit
 */
import type { Callback } from './@ohos.base';
/**
 * This module provides the capability to subscribe to report the distance measurement result.
 * @namespace spatialAwareness
 * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
 * @systemapi
 * @stagemodelonly
 * @since 23 dynamic&static
 */
declare namespace spatialAwareness {
  /**
   * Enum for distance measurement technology types.
   *
   * @enum { int } TechnologyType
   * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
   * @systemapi
   * @stagemodelonly
   * @since 23 dynamic&static
   */
  export enum TechnologyType {
    /**
     * indicates Bluetooth Low Energy (BLE) technology
     * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
     * @systemapi
     * @stagemodelonly
     * @since 23 dynamic&static
     */
    BLE_RSSI = 0,
    /**
     * indicates Wi-Fi technology
     * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
     * @systemapi
     * @stagemodelonly
     * @since 23 dynamic&static
     */
    WIFI_RSSI = 1,
    /**
     * indicates ultrasound technology
     * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
     * @systemapi
     * @stagemodelonly
     * @since 23 dynamic&static
     */
    ULTRASOUND = 2,
    /**
     * indicates NearLink technology
     * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
     * @systemapi
     * @stagemodelonly
     * @since 23 dynamic&static
     */
    NEAR_LINK = 3,
    /**
     * indicates Wi-Fi and Bluetooth technology
     * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
     * @systemapi
     * @stagemodelonly
     * @since 23 dynamic&static
     */
    WIFI_BLE_RSSI = 4
  }
  /**
   * Enum for distance measurement result reporting modes.
   * @enum { int } ReportingMode
   * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
   * @systemapi
   * @stagemodelonly
   * @since 23 dynamic&static
   */
  export enum ReportingMode {
    /**
     * indicates periodic reporting
     *
     * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
     * @systemapi
     * @stagemodelonly
     * @since 23 dynamic&static
     */
    REPORT_MODE_PERIODIC_REPORTING = 0,
    /**
     * indicates triggered reporting
     * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
     * @systemapi
     * @stagemodelonly
     * @since 23 dynamic&static
     */
    REPORT_MODE_TRIGGERED_REPORTING = 1
  }
  
  /**
   * Enum for distance rank.
   *
   * @enum { string } DistanceRank
   * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
   * @systemapi
   * @stagemodelonly
   * @since 23 dynamic&static
   */
  export enum DistanceRank {
    /**
     * indicates ultra-short range
     * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
     * @systemapi
     * @stagemodelonly
     * @since 23 dynamic&static
     */
    RANK_ULTRA_SHORT_RANGE = 'rankUltraShort',
    /**
     * indicates short range
     * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
     * @systemapi
     * @stagemodelonly
     * @since 23 dynamic&static
     */
    RANK_SHORT_RANGE = 'rankShort',
    /**
     * indicates medium-short range
     * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
     * @systemapi
     * @stagemodelonly
     * @since 23 dynamic&static
     */
    RANK_SHORT_MEDIUM_RANGE = 'rankMediumShort',
    /**
     * indicates medium range
     *
     * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
     * @systemapi
     * @stagemodelonly
     * @since 23 dynamic&static
     */
    RANK_MEDIUM_RANGE = 'rankMedium'
  }
  
  /**
   * Interface for distance measurement result
   * @interface DistanceMeasurementResponse
   * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
   * @systemapi
   * @stagemodelonly
   * @since 23 dynamic&static
   */
  export interface DistanceMeasurementResponse {
    /**
     * indicates distance rank
     * @type { DistanceRank }
     * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
     * @systemapi
     * @stagemodelonly
     * @since 23 dynamic&static
     */
    rank: DistanceRank;
    /**
     * indicates distance result
     * @type { float }
     * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
     * @systemapi
     * @stagemodelonly
     * @since 23 dynamic&static
     */
    distance: float;
    /**
     * indicates confidence of distance measurement
     * @type { float }
     * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
     * @systemapi
     * @stagemodelonly
     * @since 23 dynamic&static
     */
    confidence: float;
    /**
     * indicates the ID of the remote ranging device
     * @type { string }
     * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
     * @systemapi
     * @stagemodelonly
     * @since 23 dynamic&static
     */
    deviceId: string;
  }
  
  /**
   * Enum for identification result inside and outside the door
   *
   * @enum { int } PositionRelativeToDoor
   * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
   * @systemapi
   * @stagemodelonly
   * @since 23 dynamic&static
   */
  export enum PositionRelativeToDoor {
   /**
    * indicates outdoor result
    * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
    * @systemapi
    * @stagemodelonly
    * @since 23 dynamic&static
    */
   OUTDOOR = 0,
   /**
    * indicates indoor result
    * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
    * @systemapi
    * @stagemodelonly
    * @since 23 dynamic&static
    */
   INDOOR = 1
  }
  
  /**
   * Interface for indoor or outdoor identify result
   * @interface DoorPositionResponse
   * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
   * @systemapi
   * @stagemodelonly
   * @since 23 dynamic&static
   */
  export interface DoorPositionResponse {
    /**
     * indicates random code for unlocking the door
     * @type { int }
     * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
     * @systemapi
     * @stagemodelonly
     * @since 23 dynamic&static
     */
    doorLockCode: int;
    /**
     * indicates result inside and outside the door
     * @type { PositionRelativeToDoor }
     * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
     * @systemapi
     * @stagemodelonly
     * @since 23 dynamic&static
     */
    position: PositionRelativeToDoor;
    /**
     * indicates the ID of the remote ranging device
     * @type { string }
     * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
     * @systemapi
     * @stagemodelonly
     * @since 23 dynamic&static
     */
    deviceId: string;
  }
  
  /**
   * Configuration parameters for the distance measurement interface
   * @interface DistanceMeasurementConfigParams
   * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
   * @systemapi
   * @stagemodelonly
   * @since 23 dynamic&static
   */
  export interface DistanceMeasurementConfigParams {
    /**
     * distance measurement supported devices list
     * @type { string[]}
     * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
     * @systemapi
     * @stagemodelonly
     * @since 23 dynamic&static
     */
    deviceList: string[];
    /**
     * distance measurement technology type
     * @type { TechnologyType }
     * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
     * @systemapi
     * @stagemodelonly
     * @since 23 dynamic&static
     */
    techType: TechnologyType;
    /**
     * distance measurement result reporting mode
     * @type { ReportingMode }
     * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
     * @systemapi
     * @stagemodelonly
     * @since 23 dynamic&static
     */
    reportMode: ReportingMode;
    /**
     * distance measurement result reporting frequency
     * @type { int }
     * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
     * @systemapi
     * @stagemodelonly
     * @since 23 dynamic&static
     */
    reportFrequency: int;
  }

  /**
   * Subscribe to distance measurement result data.
   * 
   * @permission ohos.permission.ACCESS_SENSING_WITH_ULTRASOUND
   * @param { DistanceMeasurementConfigParams } configParams - Configuration parameters of the distance measurement.
   * @param { Callback<DistanceMeasurementResponse> } callback - Callback of the ranging result
   * @throws { BusinessError } 201 - Permission denied.
   * @throws { BusinessError } 202 - Not system application.
   * @throws { BusinessError } 801 - Capability not supported. Function can not work correctly due to
   *     <br> limited device capabilities.
   * @throws { BusinessError } 35100001 - Service exception.
   * @throws { BusinessError } 35100002 - Subscription failed.
   * @throws { BusinessError } 35100004 - Parameter invalid.
   * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
   * @systemapi
   * @stagemodelonly
   * @since 23 dynamic&static
   */
  function onDistanceMeasure(configParams: DistanceMeasurementConfigParams,
    callback: Callback<DistanceMeasurementResponse>): void;

  /**
   * Unsubscribe from distance measurement result data.
   * 
   * @permission ohos.permission.ACCESS_SENSING_WITH_ULTRASOUND
   * @param { DistanceMeasurementConfigParams } configParams - Configuration parameters of the distance measurement.
   * @param { Callback<DistanceMeasurementResponse> } [callback] - Callback of the ranging result
   * @throws { BusinessError } 201 - Permission denied.
   * @throws { BusinessError } 202 - Not system application.
   * @throws { BusinessError } 801 - Capability not supported. Function can not work correctly due to
   *     <br> limited device capabilities.
   * @throws { BusinessError } 35100001 - Service exception.
   * @throws { BusinessError } 35100003 - UnSubscription failed.
   * @throws { BusinessError } 35100004 - Parameter invalid.
   * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
   * @systemapi
   * @stagemodelonly
   * @since 23 dynamic&static
   */
  function offDistanceMeasure(configParams: DistanceMeasurementConfigParams,
    callback?: Callback<DistanceMeasurementResponse>): void;
   
  /**
   * Subscribe to the results of indoorand outdoor identification.
   * 
   * @permission ohos.permission.ACCESS_SENSING_WITH_ULTRASOUND
   * @param { DistanceMeasurementConfigParams } configParams - Configuration parameters for identification inside and
   *     <br> outside the door.
   * @param { Callback<DoorPositionResponse> } callback - Callback for identification inside and outside the door.
   * @throws { BusinessError } 201 - Permission denied.
   * @throws { BusinessError } 202 - Not system application.
   * @throws { BusinessError } 801 - Capability not supported. Function can not work correctly due to
   *     <br> limited device capabilities.
   * @throws { BusinessError } 35100001 - Service exception.
   * @throws { BusinessError } 35100002 - Subscription failed.
   * @throws { BusinessError } 35100004 - Parameter invalid.
   * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
   * @systemapi
   * @stagemodelonly
   * @since 23 dynamic&static
   */
  function onIndoorOrOutdoorIdentify(configParams: DistanceMeasurementConfigParams,
    callback: Callback<DoorPositionResponse>): void;
   
  /**
   * Unsubscribe from the results of indoor and outdoor recognition.
   * 
   * @permission ohos.permission.ACCESS_SENSING_WITH_ULTRASOUND
   * @param { DistanceMeasurementConfigParams } configParams - Configuration parameters for identification inside and
   *     <br> outside the door
   * @param { Callback<DoorPositionResponse> } [callback] - Callback for identification inside and outside the door
   * @throws { BusinessError } 201 - Permission denied.
   * @throws { BusinessError } 202 - Not system application.
   * @throws { BusinessError } 801 - Capability not supported. Function can not work correctly due to
   *     <br> limited device capabilities.
   * @throws { BusinessError } 35100001 - Service exception.
   * @throws { BusinessError } 35100003 - Unsubscription failed.
   * @throws { BusinessError } 35100004 - Parameter invalid.
   * @syscap SystemCapability.MultimodalAwareness.DistanceMeasurement
   * @systemapi
   * @stagemodelonly
   * @since 23 dynamic&static
   */
  function offIndoorOrOutdoorIdentify(configParams: DistanceMeasurementConfigParams,
    callback?: Callback<DoorPositionResponse>): void;
}
export default spatialAwareness;