import 'package:flutter_webrtc/flutter_webrtc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';

import '../../../app/constants/app_constants.dart';
import 'binding_device.dart';

part 'connection_session_state.freezed.dart';

/// 连接控制会话的 UI 状态。
@freezed
class ConnectionSessionState with _$ConnectionSessionState {
  const factory ConnectionSessionState({
    /// 是否已建立 WebRTC 连接（可开始远程控制）。
    @Default(false) bool connected,

    /// 是否正在连接信令服务器 / 建立 WebRTC。
    @Default(false) bool connecting,

    /// 信令（WebSocket）是否已连接并注册成功。
    @Default(false) bool signalingConnected,

    /// 信令注册后服务端下发的本机设备ID。
    String? myDeviceId,

    /// 状态提示文本。
    @Default('') String status,

    /// 主控端已绑定的被控设备列表（供用户选择连接）。
    @Default(<BindingDevice>[]) List<BindingDevice> bindings,

    /// 当前在线的已绑定设备 uid 集合（用于列表标记在线状态）。
    @Default(<String>{}) Set<String> onlineUids,

    /// 用户在绑定设备列表中选中的目标设备 uid。
    String? selectedDeviceUid,

    /// 是否正在拉取绑定设备列表 / 在线状态。
    @Default(false) bool deviceRefreshing,

    /// 设备列表加载失败时的错误提示（null 表示无错误）。
    String? deviceError,

    /// 是否正在兑换配对码建立绑定。
    @Default(false) bool redeeming,

    /// 配对码兑换失败提示（null 表示无错误）。
    String? redeemError,

    /// 连接统计文本（每秒刷新）。
    @Default('') String stats,

    /// 当前视频宽高比。
    @Default(16 / 9) double videoAspect,

    /// 当前串流模式：0=WebRTC 全托管；1=自编码。
    @Default(0) int streamMode,

    /// 自编码解码纹理 id。
    int? selfCodecTextureId,

    /// 自编码解码器是否就绪。
    @Default(false) bool selfCodecReady,

    /// 当前平台是否支持自编码硬解。
    @Default(true) bool selfCodecSupported,

    /// 是否正在录制远程视频。
    @Default(false) bool recording,

    /// 录制状态提示。
    @Default('') String recordStatus,

    /// 自编码模式下请求录制时，先切回 WebRTC 标准模式再开始录制。
    @Default(false) bool pendingRecordStart,

    /// 当前选中的分辨率预设下标。
    @Default(0) int selectedResolution,

    /// 分辨率预设列表。
    @Default(kResolutionOptions) List<Map<String, Object>> resolutionOptions,

    /// 帧率档位（收到被控端上报后以上报列表为准）。
    @Default(kDefaultFpsOptions) List<int> fpsOptions,

    /// 被控端当前采集帧率（0 表示尚未收到上报）。
    @Default(0) int currentFps,

    /// 被控端最近上报的实际采集尺寸（切帧率时保持分辨率不变）。
    @Default(0) int lastReportedWidth,

    /// 被控端最近上报的实际采集尺寸。
    @Default(0) int lastReportedHeight,

    /// 远端视频渲染器（未连接为 null）。
    RTCVideoRenderer? renderer,

    /// 一次性提示消息（消费后由控制器置空）。
    String? alert,
  }) = _$ConnectionSessionStateImpl;
}
