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

/// API 重试仓储接口
abstract class ApiRetryRepository {
  // ── 监听 ─────────────────────────────────────────────────────────────────

  Stream<List<ApiRetry>> watchAll();

  Stream<List<ApiRetry>> watchPending();

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

  Future<List<ApiRetry>> getAll();

  Future<ApiRetry?> getById(int id);

  /// 读取指定 uid 的第一条重试任务
  Future<ApiRetry?> getByUid(int uid);

  /// 读取未同步的重试任务
  Future<List<ApiRetry>> getPending();

  /// 读取未过期的重试任务
  Future<List<ApiRetry>> getActive();

  /// 读取指定 endPoint 且未同步的重试任务，按 createTime 升序
  Future<List<ApiRetry>> getByEndPointPending(String endPoint);

  /// 读取指定同步状态的所有重试任务，按 createTime 升序
  /// synced: 0 未同步 / 1 已同步 / -1 失败
  Future<List<ApiRetry>> getBySynced(int synced);

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

  /// 插入重试任务（autoIncrement id，无需提供）
  Future<void> insert(ApiRetry apiRetry);

  Future<void> insertOrReplace(ApiRetry apiRetry);

  Future<void> update(ApiRetry apiRetry);

  /// 标记为已同步
  Future<void> markSynced(int id);

  /// 标记为已过期
  Future<void> markExpired(int id);

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

  Future<void> delete(int id);

  Future<void> deleteByUid(int uid);

  /// 删除已完成的重试任务（synced = success / failed / cancel / replace）
  Future<void> deleteFinished();

  /// 清除已同步的重试任务
  Future<void> deleteSynced();

  Future<void> clear();
}
