/**
 * 文件用途：公告模块 TypeScript 类型定义
 * 作者：前端架构师（Codex）
 * 日期：2025-12-20
 */

/** 雪花ID（后端long序列化为字符串） */
export type SnowflakeId = string

/** UTC ISO 8601 时间字符串 */
export type IsoDateTimeString = string

/** 公告状态（字符串字面量） */
export type AnnouncementStatus = 'Draft' | 'Published' | 'Revoked'

/** 发布者范围（字符串字面量） */
export type PublisherScope = 'Platform' | 'Tenant'

/** 公告类型（数字枚举 0-8） */
export enum TenantAnnouncementType {
  System = 0, // 系统公告
  Billing = 1, // 账单/订阅相关提醒
  Operation = 2, // 运营通知
  SYSTEM_PLATFORM_UPDATE = 3, // 平台系统更新公告
  SYSTEM_SECURITY_NOTICE = 4, // 系统安全公告
  SYSTEM_COMPLIANCE = 5, // 系统合规公告
  TENANT_INTERNAL = 6, // 租户内部公告
  TENANT_FINANCE = 7, // 租户财务公告
  TENANT_OPERATION = 8 // 租户运营公告
}

/** 目标受众类型（字符串字面量） */
export type AnnouncementTargetType = 'All' | 'Roles' | 'Users' | 'Rules' | 'Manual'

/** 公告DTO（对齐后端 TenantAnnouncementDto） */
export interface TenantAnnouncementDto {
  id: SnowflakeId // 公告ID（雪花ID字符串）
  tenantId: SnowflakeId // 租户ID（雪花ID字符串）
  title: string // 标题
  content: string // 内容（富文本）
  announcementType: TenantAnnouncementType // 公告类型
  priority: number // 优先级
  effectiveFrom: IsoDateTimeString // 生效开始时间（UTC）
  effectiveTo?: IsoDateTimeString | null // 生效结束时间（UTC）
  publisherScope: PublisherScope // 发布者范围
  publisherUserId?: SnowflakeId | null // 发布人用户ID（雪花ID字符串）
  status: AnnouncementStatus // 公告状态
  publishedAt?: IsoDateTimeString | null // 发布时间（UTC）
  revokedAt?: IsoDateTimeString | null // 撤销时间（UTC）
  scheduledPublishAt?: IsoDateTimeString | null // 计划发布时间（UTC）
  targetType: AnnouncementTargetType // 目标受众类型
  targetParameters?: string | null // 目标参数（JSON字符串）
  rowVersion: string // 并发控制版本（Base64字符串）
  isActive: boolean // 是否生效
  isRead: boolean // 当前用户是否已读
  readAt?: IsoDateTimeString | null // 已读时间（UTC）
}

/** 目标受众规则（规则模式） */
export interface TargetRules {
  departments?: string[] // 部门ID列表
  roles?: string[] // 角色ID列表
  tags?: string[] // 标签ID列表
}

/** 公告表单数据（创建/编辑） */
export interface AnnouncementFormData {
  title: string // 标题
  content: string // 内容（富文本）
  announcementType: TenantAnnouncementType // 公告类型
  priority: number // 优先级
  effectiveFrom: IsoDateTimeString // 生效开始时间（UTC）
  effectiveTo?: IsoDateTimeString | null // 生效结束时间（UTC）
  targetType: AnnouncementTargetType // 目标受众类型
  targetRules?: TargetRules // 规则模式参数
  targetUserIds?: SnowflakeId[] // 手选用户ID列表（雪花ID字符串）
  rowVersion?: string // 并发控制版本（更新时必传）
}

/** 公告查询参数 */
export interface AnnouncementQueryParams {
  page?: number // 页码
  pageSize?: number // 每页数量
  status?: AnnouncementStatus // 状态筛选
  keyword?: string // 关键词（标题/内容）
  effectiveFrom?: IsoDateTimeString // 生效开始时间（UTC）
  effectiveTo?: IsoDateTimeString // 生效结束时间（UTC）
  dateFrom?: IsoDateTimeString // 起始时间（UTC）
  dateTo?: IsoDateTimeString // 结束时间（UTC）
  onlyEffective?: boolean // 仅查询有效公告
  tenantId?: SnowflakeId // 租户ID（雪花ID字符串）
  isRead?: boolean // 已读状态筛选
}

/** 公告草稿数据 */
export interface AnnouncementDraft extends Partial<AnnouncementFormData> {
  draftId: string // 草稿ID
  lastSaved: IsoDateTimeString // 上次保存时间（UTC）
}

/** 受众预估结果 */
export interface AudienceEstimate {
  count: number // 预估人数
  preview: SnowflakeId[] // 预览用户ID（前10个）
}

/** 公告统计数据 */
export interface AnnouncementStatistics {
  totalCount: number // 总数
  draftCount: number // 草稿数量
  publishedCount: number // 已发布数量
  revokedCount: number // 已撤销数量
  unreadCount: number // 未读数量
}

/** 公告操作命令（发布/撤销） */
export interface AnnouncementCommand {
  announcementId: SnowflakeId // 公告ID（雪花ID字符串）
  rowVersion: string // 并发控制版本（Base64字符串）
}

/** 批量标记已读命令 */
export interface BatchMarkReadCommand {
  announcementIds: SnowflakeId[] // 公告ID列表（雪花ID字符串）
}

/** 公告类型选项（下拉框） */
export interface AnnouncementTypeOption {
  label: string // 显示文本
  value: TenantAnnouncementType // 类型值
  icon?: string // 图标
  color?: string // 颜色
}

/** 公告状态选项（下拉框） */
export interface AnnouncementStatusOption {
  label: string // 显示文本
  value: AnnouncementStatus // 状态值
  color?: string // 颜色
}
