import 'package:json_annotation/json_annotation.dart';

part 'binding_device.g.dart';

/// 主控端已绑定的被控设备（对应服务端 DeviceBinding / 在线设备列表）。
///
/// 字段对齐 [WebRTCSignalServer] 的 [DeviceBinding] 与 OnDeviceDto，
/// 以及 Android 控制端的 [BindingItem]，供用户在列表中选取并连接。
@JsonSerializable(fieldRename: FieldRename.snake)
class BindingDevice {
  const BindingDevice({
    required this.deviceUid,
    this.name,
    this.online = false,
    this.authType = 'NONE',
    this.lastSeen,
  });

  /// 被控端设备唯一标识（连接信令时使用）。
  ///
  /// 服务端 [DeviceBinding.deviceUid]（必返回，缺失时兜底空串以保证列表可用）。
  @JsonKey(name: 'deviceUid')
  final String deviceUid;

  /// 设备展示名称，对应服务端 [DeviceBinding.alias]，可为 null。
  ///
  /// 未设置别名时回退为设备标识，避免空名称影响展示与选择。
  @JsonKey(name: 'alias')
  final String? name;

  /// 是否在线（信令网络中活跃）。
  final bool online;

  /// 连接鉴权方式：NONE / PASSWORD / CODE。
  ///
  /// 服务端字段为 [DeviceBinding.authType]，缺失时默认 NONE。
  @JsonKey(name: 'authType', defaultValue: 'NONE')
  final String authType;

  /// 最近一次在线时间戳（毫秒）。
  @JsonKey(name: 'lastSeen')
  final int? lastSeen;

  factory BindingDevice.fromJson(Map<String, dynamic> json) =>
      _$BindingDeviceFromJson(json);

  Map<String, dynamic> toJson() => _$BindingDeviceToJson(this);

  BindingDevice copyWith({
    String? deviceUid,
    String? name,
    bool? online,
    String? authType,
    int? lastSeen,
  }) =>
      BindingDevice(
        deviceUid: deviceUid ?? this.deviceUid,
        name: name ?? this.name,
        online: online ?? this.online,
        authType: authType ?? this.authType,
        lastSeen: lastSeen ?? this.lastSeen,
      );
}
