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

/// 消息仓储接口
///
/// ## 职责
/// - StorageSdkApi ↔ Domain Message 映射
/// - CRUD 操作（通过 StorageSdkApi，不直接接触 DB）
/// - 所有公开接口只接受 Domain 实体，Companion 转换完全内聚在 Impl
///
/// ## 数据流
/// ```
/// 写入：Domain Message → _toCompanion() → StorageSdkApi → DB
/// 读取：DB row (DriftMessage) → _toEntity() → Domain Message
/// 监听：DB 变化 → stream → Domain Message → UI
/// ```
abstract class MessageRepository {
  // ── 监听 ─────────────────────────────────────────────────────────────────

  /// 监听指定 chatId 的所有消息，按 chatIdx 升序
  Stream<List<Message>> watchByChatId(int chatId);

  /// 监听指定消息
  Stream<Message?> watchById(int id);

  // ── 读取 ─────────────────────────────────────────────────────────────────

  /// 读取指定 chatId 的所有消息，按 chatIdx 升序
  Future<List<Message>> getByChatId(int chatId);

  /// 分页读取指定 chatId 的消息
  Future<List<Message>> getByChatIdPage({
    required int chatId,
    required int offset,
    required int limit,
  });

  /// 读取指定消息，不存在返回 null
  Future<Message?> getById(int id);

  /// 读取指定 messageId，不存在返回 null
  Future<Message?> getByMessageId(int messageId);

  /// 统计指定 chatId 的消息数量
  Future<int> countByChatId(int chatId);

  // ── 写入 ─────────────────────────────────────────────────────────────────

  /// 插入或替换消息
  Future<void> insertOrReplace(Message message);

  /// 批量插入或替换消息
  Future<void> insertOrReplaceAll(List<Message> messages);

  /// 更新消息
  Future<void> update(Message message);

  // ── 删除 ─────────────────────────────────────────────────────────────────

  /// 删除指定消息
  Future<void> delete(int id);

  /// 删除指定 chatId 的所有消息
  Future<void> deleteByChatId(int chatId);

  /// 清空所有消息
  Future<void> clear();
}
