import type { KeplerTurboModule } from '@amazon-devices/keplerscript-turbomodule-api';
import { AccessoryBasicInfo, AccessoryCategory, AccessoryControlStatus, AccessoryEventHandlerType, AccessoryInfo, AccessoryListType, AccessoryPairingResponse, AccessoryProtocol, LocalDeviceVisibility, AccessoryDfuMode, AccessoryConfigurationEntry } from './AccClientTypes';
/**
 * @interface AccessoryRequestStatus
 * @description Accessory request status
 */
export interface AccessoryRequestStatus {
    /** Response status */
    status: AccessoryControlStatus;
}
/**
 * @interface AccessoryRequestResponse
 * @description Accessory request response
 */
export interface AccessoryRequestResponse<T> extends AccessoryRequestStatus {
    /** Response data */
    response: T;
}
export interface AccClientTurboModule extends KeplerTurboModule {
    /**
     * @brief initialize as a client to ACC server.
     *
     * @throws {AccessoryControlStatus} if not successful.
     */
    initialize: (callback: AccessoryEventHandlerType) => number;
    /**
     * @brief Deinitialize as a client to ACC server.
     *
     * @throws {AccessoryControlStatus} if not successful.
     */
    deinitialize: () => Promise<AccessoryRequestStatus>;
    /**
     * @brief Start accessory discovery
     *
     * @param[in] protocol Protocol bridge to start discovery
     * @param[in] category Accessory category to be discovered
     * @param[in] duration Accessory discovery duration in seconds
     *
     * @throws {AccessoryControlStatus} if not successful.
     */
    startAccessoryDiscovery: (protocol: AccessoryProtocol, category: AccessoryCategory, duration?: number) => Promise<AccessoryRequestStatus>;
    /**
     * @brief Cancel accessory discovery
     *
     * @throws {AccessoryControlStatus} if not successful.
     */
    cancelAccessoryDiscovery: (protocol: AccessoryProtocol) => Promise<AccessoryRequestStatus>;
    /**
     * @brief Start accessory autopair
     *
     * @param[in] protocol Accessory protocol to start autopair
     * @param[in] category Accessory category
     * @param[in] duration Accessory autopair duration in seconds
     *
     * @remarks This is currently specially used to support automatically discover and pair with
     * Remote Controllers in TV use cases, so only AccessoryCategory.REMOTE_CONTROLLER is supported.
     *
     * @throws {AccessoryControlStatus} if not successful.
     */
    startAccessoryAutopair: (protocol: AccessoryProtocol, category: AccessoryCategory, duration?: number) => Promise<AccessoryRequestStatus>;
    /**
     * @brief Cancel accessory autopair
     *
     * @throws {AccessoryControlStatus} if not successful.
     */
    cancelAccessoryAutopair: (protocol: AccessoryProtocol) => Promise<AccessoryRequestStatus>;
    /**
     * @brief Set local device visibility mode
     *
     * @param[in] protocol Accessory protocol
     * @param[in] visibility Local device visibility mode
     * @param[in] duration Accessory discoverable duration in seconds when visibility
     * is set to LocalDeviceVisibility.CONNECTABLE_DISCOVERABLE.
     *
     * @throws {AccessoryControlStatus} if not successful.
     */
    setLocalDeviceVisibility: (protocol: AccessoryProtocol, visibility: LocalDeviceVisibility, duration?: number) => Promise<AccessoryRequestStatus>;
    /**
     * @brief Pair accessory
     *
     * @param[in] accessoryIdentity Accessory identity to pair
     *
     * @throws {AccessoryControlStatus} if not successful.
     */
    pairAccessory: (accessoryIdentity: string) => Promise<AccessoryRequestStatus>;
    /**
     * @brief Unpair accessory
     *
     * @param[in] accessoryIdentity Accessory identity to unpair
     *
     * @throws {AccessoryControlStatus} if not successful.
     */
    unpairAccessory: (accessoryIdentity: string) => Promise<AccessoryRequestStatus>;
    /**
     * @brief Connect accessory
     *
     * @param[in] accessoryIdentity Accessory identity to connect
     *
     * @throws {AccessoryControlStatus} if not successful.
     */
    connectAccessory: (accessoryIdentity: string) => Promise<AccessoryRequestStatus>;
    /**
     * @brief Disconnect accessory
     *
     * @param[in] accessoryIdentity Accessory identity to disconnect
     *
     * @throws {AccessoryControlStatus} if not successful.
     */
    disconnectAccessory: (accessoryIdentity: string) => Promise<AccessoryRequestStatus>;
    /**
     * @brief start accessory DFU
     *
     * @param[in] accessoryIdentity Accessory identity to start DFU
     * @param[in] dfuMode Accessory DFU mode
     *
     * @throws {AccessoryControlStatus} if not successful.
     */
    startAccessoryDfu: (accessoryIdentity: string, dfuMode: AccessoryDfuMode) => Promise<AccessoryRequestStatus>;
    /**
     * @brief Send accessory pairing response
     *
     * @param[in] accessoryIdentity Accessory identity to send pairing response
     * @param[in] pairingResponse Application provided pairing response
     *
     * @throws Error of {AccessoryControlStatus} if not successful.
     */
    sendAccessoryPairingResponse: (accessoryIdentity: string, pairingResponse: AccessoryPairingResponse) => Promise<AccessoryRequestStatus>;
    /**
     * @brief Get accessory list
     *
     * @param[in] accessoryListType Accessory list type
     *
     * @returns JSON string of an array of accessories.
     */
    getAccessoryList: (accessoryList: AccessoryListType) => Promise<AccessoryRequestResponse<Array<AccessoryBasicInfo>>>;
    /**
     * @brief Get accessory information
     *
     * @param[in] accessoryIdentity Accessory identity to get information
     * @param[in] needExtraInfo Flag set to get extra information, default as false.
     * @param[in] extraInfoKey Extra information key, valid when `needExtraInfo` is true.
     *
     * @returns JSON string of accessory information.
     */
    getAccessoryInfo: (accessoryIdentity: string, needExtraInfo?: boolean, extraInfoKeys?: Array<string>) => Promise<AccessoryRequestResponse<AccessoryInfo>>;
    /**
     * @brief Get accessory configuration
     *
     * @param[in] accessoryIdentity Accessory identity
     *
     * @returns JSON string of accessory configuration
     */
    getAccessoryConfiguration: (accessoryIdentity: string) => Promise<AccessoryRequestResponse<AccessoryConfigurationEntry>>;
    /**
     * @brief Get major version
     *
     * @returns Major version number
     */
    getMajorVersion: () => number;
    /**
     * @brief Get minor version
     *
     * @returns Minor version number
     */
    getMinorVersion: () => number;
    /**
     * @brief Get patch version
     *
     * @returns Patch version number
     */
    getPatchVersion: () => number;
}
declare const _default: AccClientTurboModule;
export default _default;
