import { PrismaClient } from '@prisma/client';

/**
 * Prisma 事务客户端类型
 * 用于在事务中传递给仓库
 */
export type PrismaTransactionClient = Omit<
  PrismaClient,
  '$connect' | '$disconnect' | '$on' | '$transaction' | '$use' | '$extends'
>;

/**
 * 仓库保存选项
 * 允许传入事务客户端以在 Unit of Work 中使用
 */
export interface RepositorySaveOptions {
  tx?: PrismaTransactionClient;
}

/**
 * Unit of Work 接口
 * 用于管理跨多个仓库的事务
 */
export interface IUnitOfWork {
  /**
   * 在事务中执行工作
   * @param work 要执行的工作函数，接收事务客户端
   * @returns 工作函数的返回值
   */
  runInTransaction<T>(
    work: (tx: PrismaTransactionClient) => Promise<T>,
  ): Promise<T>;
}

export const UNIT_OF_WORK = Symbol('IUnitOfWork');
