import 'dart:collection';

import 'package:fis_common/event/event_type.dart';
import 'package:fis_lib_media_rt/interface/player.dart';
import 'package:fis_lib_media_rt/interface/publisher.dart';

import 'member.dart';

/// 会话房间接口
abstract class IRoom {
  /// 房间号
  String get roomId;

  /// 远端成员集合
  UnmodifiableListView<IMember> get remoteMembers;

  /// 本地成员
  IMember get localMember;

  /// 是否已进入房间
  bool get isEntered;

  /// 成员加入事件
  late final FEventHandler<IMember> memberJoined;

  /// 成员离开事件
  late final FEventHandler<IMember> memberLeaved;

  /// 已退出房间事件
  late final FEventHandler<void> exited;

  /// 已进入房间事件
  late final FEventHandler<void> entered;

  /// 错误发送事件
  late final FEventHandler<Object> errorOccurred;

  /// 装载本地成员
  void loadLocalMember(ILocalMemberParams params);

  /// 进入房间
  Future<void> enter();

  /// 退出房间
  Future<void> exit();

  /// 开启屏幕共享
  Future<void> startScreenCapture(String userId, String userSign);

  /// 关闭屏幕共享
  Future<void> stopScreenCapture();

  /// 截取某位成员的视频帧
  ///
  /// [userId] `null`表示截屏本地视频。对于本地视频，只能截取摄像头图像（TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG）。
  ///
  /// [streamType] 视频流类型。支持相机图片（TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG）和屏幕分享图片（TRTCCloudDef#TRTC_VIDEO_STREAM_TYPE_SUB）。
  ///
  /// [path] 图片保存路径，支持 PNG 和 JPEG 格式，需要精确到后缀，且确保可访问。
  Future<void> captureVideoFrame(
    String? userId,
    int streamType,
    String path,
  );

  /// 将指定成员踢出房间（权限限制）
  ///
  /// [memberId] 成员ID
  Future<void> kickMember(String memberId);

  /// 创建
  IPublisher createPublisher();

  /// 创建播放器
  IPlayer createPlayer();
}
