/**
 * 系统活动日志仓储接口
 */
export const SYSTEM_ACTIVITY_REPOSITORY = Symbol('SYSTEM_ACTIVITY_REPOSITORY');

export type ActivityType =
  | 'user_register'           // 用户注册
  | 'planting_order'          // 认种订单
  | 'contract_signed'         // 合同签署
  | 'kyc_submitted'           // KYC提交
  | 'kyc_approved'            // KYC通过
  | 'kyc_rejected'            // KYC拒绝
  | 'deposit'                 // 充值
  | 'withdrawal'              // 提现
  | 'company_authorization'   // 公司授权
  | 'benefit_applied'         // 权益申请
  | 'system_update'           // 系统更新
  | 'report_generated';       // 报表生成

export interface SystemActivityData {
  id?: bigint;
  activityType: ActivityType | string;
  title: string;
  description: string;
  icon?: string;
  relatedUserId?: bigint;
  relatedEntityId?: string;
  relatedEntityType?: string;
  metadata?: Record<string, unknown>;
  createdAt?: Date;
}

export interface ISystemActivityRepository {
  /**
   * 创建活动记录
   */
  create(activity: SystemActivityData): Promise<SystemActivityData>;

  /**
   * 批量创建活动记录
   */
  createMany(activities: SystemActivityData[]): Promise<number>;

  /**
   * 根据ID查找
   */
  findById(id: bigint): Promise<SystemActivityData | null>;

  /**
   * 获取最近的活动记录
   */
  findRecent(limit: number): Promise<SystemActivityData[]>;

  /**
   * 根据活动类型查找
   */
  findByType(
    type: ActivityType | string,
    limit?: number,
  ): Promise<SystemActivityData[]>;

  /**
   * 根据关联用户ID查找
   */
  findByUserId(userId: bigint, limit?: number): Promise<SystemActivityData[]>;

  /**
   * 根据关联实体查找
   */
  findByEntity(
    entityType: string,
    entityId: string,
    limit?: number,
  ): Promise<SystemActivityData[]>;

  /**
   * 获取日期范围内的活动
   */
  findByDateRange(
    startDate: Date,
    endDate: Date,
    limit?: number,
  ): Promise<SystemActivityData[]>;

  /**
   * 删除指定日期之前的活动
   */
  deleteBeforeDate(date: Date): Promise<number>;

  /**
   * 统计活动数量
   */
  countByType(type: ActivityType | string): Promise<number>;

  /**
   * 检查活动是否已存在（用于幂等性检查）
   * @param activityType 活动类型
   * @param entityType 实体类型
   * @param entityId 实体ID
   */
  exists(
    activityType: ActivityType | string,
    entityType: string,
    entityId: string,
  ): Promise<boolean>;

  /**
   * 幂等创建活动记录（如果不存在则创建）
   * @returns 创建的活动记录，如果已存在则返回 null
   */
  createIfNotExists(activity: SystemActivityData): Promise<SystemActivityData | null>;
}
