/**
 * 私信模块类型定义
 *
 * 通知相关类型（NotificationType, Notification, NotificationPreferences,
 * UpdateNotificationPreferencesInput, CreateNotificationInput, GetNotificationsParams,
 * PaginatedResult）已迁移到 notifications/types.ts，请直接从该模块导入。
 */

import type { DataScope } from "@/shared/types/permissions"

export type MessageType = "inbox" | "sent" | "all"

/** 收件人角色枚举（P1-6 收紧类型，替代宽松的 string） */
export type RecipientRole = "student" | "teacher" | "admin" | "parent"

/**
 * P2-7: 收件人解析器上下文。
 *
 * 将 userId 和 dataScope 打包传入解析器，便于统一签名。
 */
export interface RecipientResolverContext {
  userId: string
  scope: DataScope
}

/**
 * P2-7: 收件人解析器签名。
 *
 * 每个 DataScope.type 对应一个解析器，返回该范围内可见的收件人列表。
 */
export type RecipientResolver = (
  ctx: RecipientResolverContext
) => Promise<RecipientOption[]>;

/**
 * P2-7: 角色收件人配置。
 *
 * 将 DataScope.type 与解析器映射解耦，新增角色仅需新增配置项，
 * 无需修改 getRecipients 主流程（开闭原则）。
 */
export interface MessagingRoleConfig {
  /** 对应的 DataScope 类型 */
  scopeType: DataScope["type"]
  /** 收件人解析器 */
  resolve: RecipientResolver
}

export interface Message {
  id: string
  senderId: string
  senderName: string | null
  receiverId: string
  receiverName: string | null
  subject: string | null
  content: string
  isRead: boolean
  isStarred: boolean
  /** P2-4: 撤回时间（ISO 字符串），非空即表示消息已被撤回 */
  recalledAt: string | null
  readAt: string | null
  parentMessageId: string | null
  /** P2-2: 群组消息 ID（fan-out on write：教师群发时每条消息共享同一 ID） */
  groupMessageId: string | null
  createdAt: string
}

export type MessageListItem = Message

export interface MessageThread {
  messages: Message[]
}

export interface GetMessagesParams {
  userId: string
  type: MessageType
  page?: number
  pageSize?: number
  keyword?: string
  /** V2-P2-13c: 仅返回星标消息 */
  starredOnly?: boolean
  /** P2-11: 按发件人 ID 筛选 */
  senderId?: string
  /** P2-11: 按日期范围筛选（起始，ISO 字符串） */
  dateFrom?: string
  /** P2-11: 按日期范围筛选（结束，ISO 字符串） */
  dateTo?: string
  /** P2-11: 按已读状态筛选（true=仅已读，false=仅未读） */
  isRead?: boolean
}

export interface CreateMessageInput {
  senderId: string
  receiverId: string
  subject?: string | null
  content: string
  parentMessageId?: string | null
}

export interface RecipientOption {
  id: string
  name: string
  email: string
  role?: RecipientRole
}

/** V2-P2-13c: 消息草稿 */
export interface MessageDraft {
  id: string
  userId: string
  receiverId: string | null
  receiverName: string | null
  subject: string | null
  content: string | null
  parentMessageId: string | null
  /** P2-10: 来源设备 ID */
  deviceId: string | null
  /** P2-10: 版本号（乐观锁） */
  version: number
  createdAt: string
  updatedAt: string
}

export interface CreateMessageDraftInput {
  userId: string
  receiverId?: string | null
  subject?: string | null
  content?: string | null
  parentMessageId?: string | null
  /** P2-10: 来源设备 ID */
  deviceId?: string | null
}

export interface UpdateMessageDraftInput {
  receiverId?: string | null
  subject?: string | null
  content?: string | null
  parentMessageId?: string | null
  /** P2-10: 来源设备 ID（用于跨设备冲突检测） */
  deviceId?: string | null
  /** P2-10: 客户端持有的版本号（用于乐观锁校验） */
  expectedVersion?: number
}

/** P2-6: 快捷回复模板 */
export interface MessageTemplate {
  id: string
  userId: string
  title: string
  content: string
  sortOrder: number
  createdAt: string
  updatedAt: string
}

export interface CreateMessageTemplateInput {
  userId: string
  title: string
  content: string
  sortOrder?: number
}

export interface UpdateMessageTemplateInput {
  title?: string
  content?: string
  sortOrder?: number
}

/** P2-5: 举报理由分类 */
export type MessageReportReason = "spam" | "harassment" | "inappropriate" | "other"

/** P2-5: 举报状态 */
export type MessageReportStatus = "pending" | "reviewed" | "dismissed" | "actioned"

/** P2-5: 消息举报记录 */
export interface MessageReport {
  id: string
  reporterId: string
  messageId: string
  reportedUserId: string
  reason: MessageReportReason
  description: string | null
  status: MessageReportStatus
  createdAt: string
  updatedAt: string
}

/** P2-5: 创建举报输入 */
export interface CreateMessageReportInput {
  reporterId: string
  messageId: string
  reportedUserId: string
  reason: MessageReportReason
  description?: string | null
}

/** P2-5: 用户屏蔽记录 */
export interface UserBlock {
  id: string
  blockerId: string
  blockedId: string
  createdAt: string
}

/** P2-3: 消息附件（复用 fileAttachments 表，targetType="message"） */
export interface MessageAttachment {
  id: string
  filename: string
  originalName: string
  mimeType: string
  size: number
  url: string | null
  createdAt: string
}
