/**
 * 通知目标配置
 */
export interface NotificationTarget {
  type: TargetType;
  tagIds?: string[]; // 标签ID列表 (AND 关系)
  segmentId?: string; // 人群包ID
  accountSequences?: string[]; // 特定用户列表
}

/**
 * 通知实体
 */
export class NotificationEntity {
  constructor(
    public readonly id: string,
    public readonly title: string,
    public readonly content: string,
    public readonly type: NotificationType,
    public readonly priority: NotificationPriority,
    public readonly targetType: TargetType,
    public readonly targetConfig: NotificationTarget | null,
    public readonly imageUrl: string | null,
    public readonly linkUrl: string | null,
    public readonly isEnabled: boolean,
    /** 是否需要强制弹窗阅读（由管理员创建时配置） */
    public readonly requiresForceRead: boolean,
    public readonly publishedAt: Date | null,
    public readonly expiresAt: Date | null,
    public readonly createdAt: Date,
    public readonly updatedAt: Date,
    public readonly createdBy: string,
  ) {}

  /**
   * 检查通知是否已发布且有效
   */
  isActive(): boolean {
    if (!this.isEnabled || !this.publishedAt) {
      return false;
    }
    const now = new Date();
    if (this.publishedAt > now) {
      return false;
    }
    if (this.expiresAt && this.expiresAt < now) {
      return false;
    }
    return true;
  }

  /**
   * 检查是否已过期
   */
  isExpired(): boolean {
    if (!this.expiresAt) {
      return false;
    }
    return this.expiresAt < new Date();
  }

  /**
   * 检查是否为定向通知
   */
  isTargeted(): boolean {
    return this.targetType !== TargetType.ALL;
  }

  /**
   * 检查是否需要标签过滤
   */
  requiresTagFilter(): boolean {
    return (
      this.targetType === TargetType.BY_TAG &&
      this.targetConfig?.tagIds !== undefined &&
      this.targetConfig.tagIds.length > 0
    );
  }

  /**
   * 检查是否为特定用户通知
   */
  isSpecificUsers(): boolean {
    return (
      this.targetType === TargetType.SPECIFIC &&
      this.targetConfig?.accountSequences !== undefined &&
      this.targetConfig.accountSequences.length > 0
    );
  }

  /**
   * 创建新通知
   */
  static create(params: {
    id: string;
    title: string;
    content: string;
    type: NotificationType;
    priority?: NotificationPriority;
    targetType?: TargetType;
    targetConfig?: NotificationTarget | null;
    imageUrl?: string | null;
    linkUrl?: string | null;
    requiresForceRead?: boolean;
    publishedAt?: Date | null;
    expiresAt?: Date | null;
    createdBy: string;
  }): NotificationEntity {
    const now = new Date();
    const targetType = params.targetType ?? TargetType.ALL;

    // 构建目标配置
    let targetConfig: NotificationTarget | null = null;
    if (params.targetConfig) {
      targetConfig = {
        ...params.targetConfig,
        type: targetType,
      };
    } else if (targetType !== TargetType.ALL) {
      targetConfig = { type: targetType };
    }

    return new NotificationEntity(
      params.id,
      params.title,
      params.content,
      params.type,
      params.priority ?? NotificationPriority.NORMAL,
      targetType,
      targetConfig,
      params.imageUrl ?? null,
      params.linkUrl ?? null,
      true,
      params.requiresForceRead ?? false,
      params.publishedAt ?? null,
      params.expiresAt ?? null,
      now,
      now,
      params.createdBy,
    );
  }

  /**
   * 更新通知
   */
  update(params: {
    title?: string;
    content?: string;
    type?: NotificationType;
    priority?: NotificationPriority;
    targetType?: TargetType;
    targetConfig?: NotificationTarget | null;
    imageUrl?: string | null;
    linkUrl?: string | null;
    isEnabled?: boolean;
    requiresForceRead?: boolean;
    publishedAt?: Date | null;
    expiresAt?: Date | null;
  }): NotificationEntity {
    return new NotificationEntity(
      this.id,
      params.title ?? this.title,
      params.content ?? this.content,
      params.type ?? this.type,
      params.priority ?? this.priority,
      params.targetType ?? this.targetType,
      params.targetConfig !== undefined ? params.targetConfig : this.targetConfig,
      params.imageUrl !== undefined ? params.imageUrl : this.imageUrl,
      params.linkUrl !== undefined ? params.linkUrl : this.linkUrl,
      params.isEnabled ?? this.isEnabled,
      params.requiresForceRead ?? this.requiresForceRead,
      params.publishedAt !== undefined ? params.publishedAt : this.publishedAt,
      params.expiresAt !== undefined ? params.expiresAt : this.expiresAt,
      this.createdAt,
      new Date(),
      this.createdBy,
    );
  }
}

/**
 * 通知类型
 */
export enum NotificationType {
  SYSTEM = 'SYSTEM',
  ACTIVITY = 'ACTIVITY',
  REWARD = 'REWARD',
  UPGRADE = 'UPGRADE',
  ANNOUNCEMENT = 'ANNOUNCEMENT',
}

/**
 * 通知优先级
 */
export enum NotificationPriority {
  LOW = 'LOW',
  NORMAL = 'NORMAL',
  HIGH = 'HIGH',
  URGENT = 'URGENT',
}

/**
 * 目标用户类型
 * 注意：与 Prisma schema 中的 TargetType 枚举保持一致
 */
export enum TargetType {
  ALL = 'ALL', // 所有用户
  BY_TAG = 'BY_TAG', // 按标签筛选
  SPECIFIC = 'SPECIFIC', // 特定用户列表
}
