import 'package:im_app/domain/entities/user.dart';

/// 群组成员的部分 [User] 表示，数据来源于群组成员接口。
///
/// 群组 API 返回的用户信息不完整，仅保证身份和在线状态字段有效。
/// 构造函数中未列出的 [User] 字段均为 null，不应依赖这些字段。
///
/// ## 何时使用 [GroupMember] vs [User]
/// - 渲染群组成员列表、成员头像等场景使用 [GroupMember]
/// - 需要联系方式、音效设置、好友关系等完整信息时，
///   请通过用户详情接口获取完整的 [User]
///
/// ## 数据流
/// ```
/// 群组 API 响应
///   → GroupMember.fromJson()    ← 群组专用字段（user_id、icon…）
///     → ★ GroupMember ★
///       → 仍是合法的 [User]，可在任何需要 [User] 的地方使用
/// ```
class GroupMember extends User {
  const GroupMember({
    required super.uid,
    super.nickname,
    super.profilePic,
    super.profilePicGaussian,
    super.lastOnline,
    super.deletedAt,
    super.role,
    super.requireUpsert = true,
  });

  /// 从群组成员 JSON 数据创建 [GroupMember]。
  ///
  /// 注意群组 API 使用了与用户接口不同的字段名：
  /// - `user_id`       → [uid]              （非 `uid`）
  /// - `user_name`     → [nickname]         （非 `nickname`）
  /// - `icon`          → [profilePic]       （非 `profile_pic`）
  /// - `icon_gaussian` → [profilePicGaussian]
  /// - `delete_time`   → [deletedAt]        （非 `deleted_at`）
  factory GroupMember.fromJson(Map<String, dynamic> json) => GroupMember(
    uid: json['user_id'] as int,
    nickname: json['user_name'],
    profilePic: json['icon'],
    profilePicGaussian: json['icon_gaussian'],
    lastOnline: json['last_online'],
    deletedAt: json['delete_time'],
    role: json['role'],
  );

  /// 序列化为群组成员 JSON 格式。
  ///
  /// 字段名与 [fromJson] 保持对称。
  /// `id`/`user_id`、`nickname`/`user_name`、`icon`/`profile_pic`
  /// 同时输出两种命名，兼容不同约定的下游消费方。
  Map<String, dynamic> toJson() => {
    'id': uid,
    'user_id': uid,
    'user_name': nickname,
    'nickname': nickname, // 兼容旧命名
    'icon': profilePic,
    'profile_pic': profilePic, // 兼容旧命名
    'icon_gaussian': profilePicGaussian,
    'last_online': lastOnline,
    'delete_time': deletedAt,
  };
}
