import type { RefObject } from 'react';
import { ResultCode } from './Enums';
import { RtcRenderConfig, RtcSnapshotVideoOption } from './Objects';
import type { RtcVideoStreamManagerEventHandler, Subscription } from './RtcEvents';
import type { RtcSurfaceView } from './RtcRenderView.native';
/**
 * The {@link RtcVideoStreamManager} class.
 */
export default class RtcVideoStreamManager implements RtcVideoStreamManagerInterface {
    /**
     * @ignore
     */
    private _listeners;
    /**
     * @ignore
     */
    private static _callMethod;
    destroy(): void;
    /**
     * Adds the [`RtcVideoStreamManagerEventHandler`]{@link RtcVideoStreamManagerEventHandler} handler.
     *
     * After setting the [`RtcVideoStreamManagerEventHandler`]{@link RtcVideoStreamManagerEventHandler} handler, you can listen for `RtcVideoStreamManager` events and receive the statistics of the corresponding RtcVideoStreamManager instance.
     * @param event The event type.
     * @param listener The [`RtcVideoStreamManagerEventHandler`]{@link RtcVideoStreamManagerEventHandler} handler.
     */
    addListener<EventType extends keyof RtcVideoStreamManagerEventHandler>(event: EventType, listener: RtcVideoStreamManagerEventHandler[EventType]): Subscription;
    /**
     * Removes the [`RtcVideoStreamManagerEventHandler`]{@link RtcVideoStreamManagerEventHandler} handler.
     *
     * For callback events that you only want to listen for once, call this method to remove the specific [`RtcVideoStreamManagerEventHandler`]{@link RtcVideoStreamManagerEventHandler} objects after you have received them.
     * @param event The event type.
     * @param listener The [`RtcVideoStreamManagerEventHandler`]{@link RtcVideoStreamManagerEventHandler} handler.
     */
    removeListener<EventType extends keyof RtcVideoStreamManagerEventHandler>(event: EventType, listener: RtcVideoStreamManagerEventHandler[EventType]): void;
    /**
     * Removes all the [`RtcVideoStreamManagerEventHandler`]{@link RtcVideoStreamManagerEventHandler} handlers.
     * @param event The event type.
     */
    removeAllListeners<EventType extends keyof RtcVideoStreamManagerEventHandler>(event?: EventType): void;
    /**
     * @~english
     * @brief Create a new video stream.
     * @param deviceId The device to be set to new stream.
     * @return
     *   - ResultCode.OK: video stream ID.
     *   - Others: Failure.
     * @note The default video stream is always available after channel joined.
     * @~chinese
     * @brief 创建一个新的视频流。
     * @param deviceId 设备 ID, 此设备会设置给新视频流。
     * @return
     *   - ResultCode.OK：视频流 ID。
     *   - 其他：失败。
     * @note 默认视频流无需创建，在频道加入成功后即有效。
     */
    createVideoStream(deviceId: string): Promise<number>;
    /**
     * @~english
     * @brief Destroy a video stream.
     * @param streamId The stream ID to be destroyed.
     * @return
     *   - ResultCode.OK: Success.
     *   - Others: Failure.
     * @note The default video stream could not be destroyed.
     * @~chinese
     * @brief 销毁一个视频流。
     * @param streamId 视频流 ID。
     * @return
     *   - ResultCode.OK：成功。
     *   - 其他：失败。
     * @note 默认视频流不可销毁。
     */
    destroyVideoStream(streamId: number): Promise<ResultCode>;
    /**
     * @~english
     * @brief Set capture device for video stream.
     * @param streamId Stream ID.
     * @param deviceId Device ID.
     * @return
     *   - ResultCode.OK: Success.
     *   - Others: Failure.
     * @~chinese
     * @brief 设置或更新视频流的采集设备。
     * @param streamId 视频流 ID。
     * @param deviceId 采集设备 ID。
     * @return
     *   - ResultCode.OK：成功。
     *   - 其他：失败。
     */
    setCaptureDevice(streamId: number, deviceId: string): Promise<ResultCode>;
    /**
     * @~english
     * @brief Get capture device of the stream.
     * @param streamId Stream ID.
     * @return
     *   - Empty: Failure, the streamId is not found.
     *   - Others: The capture device ID.
     * @~chinese
     * @brief 获取视频流的采集设备。
     * @param streamId 视频流 ID。
     * @return
     *   - 空字符串：失败，streamId未找到或其他错误。
     *   - 非空字符串：成功，返回采集设备ID。
     */
    getCaptureDevice(streamId: number): Promise<string>;
    /**
     * @~english
     * @brief Start video.
     * @param streamId video stream ID.
     * @param profileType video profile type.
     * @return
     *   - ResultCode.OK: Success.
     *   - Others: Failure.
     * @note Please join one channel before starting video, otherwise it will fail.
     * @~chinese
     * @brief 开启视频。
     * @param streamId 视频流 ID。
     * @param profileType 视频分辨率。
     * @return
     *   - ResultCode.OK：成功。
     *   - 其他：失败。
     * @note 开启视频前请先加入一个频道，否则将返回失败。
     */
    startVideo(streamId: number, view: RefObject<RtcSurfaceView>, config?: RtcRenderConfig): Promise<ResultCode>;
    /**
     * @~english
     * @brief Stop video stream.
     * @param streamId Stream ID.
     * @return
     *   - ResultCode.OK: Success.
     *   - Others: Failure.
     * @~chinese
     * @brief 关闭视频流。
     * @param streamId 视频流 ID。
     * @return
     *   - ResultCode.OK: 调用成功。
     *   - 其他：调用失败。
     */
    stopVideo(streamId: number): Promise<ResultCode>;
    /**
     * @~english
     * @brief Pause video stream.
     * @param streamId Stream ID.
     * @return
     *   - ResultCode.OK: Success.
     *   - Others: Failure.
     * @note Please start the video stream before pausing, otherwise it will not work.
     * @~chinese
     * @brief 暂停视频流。
     * @param streamId 视频流 ID。
     * @return
     *   - ResultCode.OK: 成功。
     *   - 其他：失败。
     * @note 暂停视频流前请先开启视频流，否则操作将无效。
     */
    muteVideo(streamId: number): Promise<ResultCode>;
    /**
     * @~english
     * @brief Resume video stream.
     * @param streamId Stream ID.
     * @return
     *   - ResultCode.OK: Success.
     *   - Others: Failure.
     * @note Please start the video stream before resuming, otherwise it will not work.
     * @~chinese
     * @brief 恢复视频。
     * @param streamId 视频流 ID。
     * @return
     *   - ResultCode.OK: 成功。
     *   - 其他：失败。
     * @note 恢复视频流前请先开启视频流，否则操作将无效。
     */
    unmuteVideo(streamId: number): Promise<ResultCode>;
    /**
     * @~english
     * @brief Subscribe to a user's video stream with render window.
     * @param userId The user ID defined by customer.
     * @param streamId Stream ID.
     * @param profile video profile type.
     * @return
     *   - ResultCode.OK: Success.
     *   - Others: Failure.
     * @note Before subscribing to a user’s video stream, please make sure the user has started the video stream.
     * @~chinese
     * @brief 订阅用户的视频流， 并设置渲染窗口。
     * @param userId 客户定义的用户标识。
     * @param streamId 视频流 ID。
     * @param profile 视频分辨率。
     * @return
     *   - ResultCode.OK: 成功。
     *   - 其他：失败。
     * @note 订阅用户的视频流前，请确保用户已开启视频流。
     */
    subscribeVideo(userId: string, streamId: number, view: RefObject<RtcSurfaceView>, config?: RtcRenderConfig): Promise<ResultCode>;
    /**
     * @~english
     * @brief Unsubscribe to a user's video stream.
     * @param userId The user ID defined by customer.
     * @param streamId Stream ID.
     * @return
     *   - ResultCode.OK: Success.
     *   - Others: Failure.
     * @note When a user stops the video or leaves the channel, the user's video will be automatically unsubscribed.
     * @~chinese
     * @brief 取消订阅用户的视频。
     * @param userId 客户定义的用户标识。
     * @param streamId 视频流 ID。
     * @return
     *   - ResultCode.OK: 成功。
     *   - 其他：失败。
     * @note 当用户停止视频流或者离开频道的时候，用户的视频流将会被自动取消订阅。
     */
    unsubscribeVideo(userId: string, streamId: number): Promise<ResultCode>;
    /**
     * @~english
     * @brief Capture specific user's video stream content.
     * @param userId the id of target user.
     * @param streamId the video stream ID.
     * @param outputDir output directory.
     * @param option snapshot option.
     * @return
     *   - ResultCode.OK: Success.
     *   - Others: Failure.
     * @~chinese
     * @brief 捕获指定用户的视频流画面。
     * @param userId 目标用户的 ID。
     * @param streamId 视频流 ID。
     * @param outputDir 输出路径。
     * @param option 快照选项。
     * @return
     *  - ResultCode.OK: 成功。
     *  - 其他：失败。
     */
    snapshotVideo(userId: string, streamId: number, outputDir: string, option?: RtcSnapshotVideoOption): Promise<ResultCode>;
}
/**
 * @ignore
 */
interface RtcVideoStreamManagerInterface {
    createVideoStream(deviceId: string): Promise<number>;
    destroyVideoStream(streamId: number): Promise<ResultCode>;
    setCaptureDevice(streamId: number, deviceId: string): Promise<ResultCode>;
    getCaptureDevice(streamId: number): Promise<string>;
    startVideo(streamId: number, view: RefObject<RtcSurfaceView>, config?: RtcRenderConfig): Promise<ResultCode>;
    stopVideo(streamId: number): Promise<ResultCode>;
    muteVideo(streamId: number): Promise<ResultCode>;
    unmuteVideo(streamId: number): Promise<ResultCode>;
    subscribeVideo(userId: string, streamId: number, view: RefObject<RtcSurfaceView>, config?: RtcRenderConfig): Promise<ResultCode>;
    unsubscribeVideo(userId: string, streamId: number): Promise<ResultCode>;
    snapshotVideo(userId: string, streamId: number, outputDir: string, option?: RtcSnapshotVideoOption): Promise<ResultCode>;
}
export {};
