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

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

  /// 监听所有通话记录，DB 变化自动反映
  Stream<List<CallLog>> watchAllCallLogs();

  /// 监听指定通话记录
  Stream<CallLog?> watchCallLog(String id);

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

  /// 读取所有通话记录，按 updated_at 降序
  Future<List<CallLog>> getCallLogs();

  /// 读取指定通话记录，不存在返回 null
  Future<CallLog?> getCallLog(String id);

  /// 检查通话记录是否存在
  Future<bool> isExist(String id);

  /// 获取未读通话数量
  ///
  /// 统计 is_read = 0 且非主叫的未接/取消/结束/超时通话
  Future<int> getUnreadCount(int currentUid);

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

  /// 插入或替换通话记录
  Future<void> insertOrReplaceCallLog(CallLog callLog);

  /// 批量插入或替换通话记录
  Future<void> insertOrReplaceCallLogs(List<CallLog> callLogs);

  /// 将所有通话记录标记为已读
  Future<void> markAllAsRead();

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

  /// 删除指定通话记录
  Future<void> deleteCallLog(String id);
}
