/**
 * 通知渠道类型定义
 *
 * 本文件定义了通知分发系统使用的核心类型：
 * - NotificationChannel: 支持的渠道枚举
 * - NotificationPayload: 通知负载（跨渠道统一）
 * - ChannelSendResult: 单次发送结果
 * - NotificationChannelConfig: 渠道配置（从环境变量加载）
 *
 * 此外，本文件还定义了站内通知记录与通知偏好的类型：
 * - NotificationType / Notification: 站内通知记录（message_notifications 表）
 * - NotificationPreferences / UpdateNotificationPreferencesInput: 通知偏好（notification_preferences 表）
 * - CreateNotificationInput / GetNotificationsParams: 通知 CRUD 入参
 * - PaginatedResult<T>: 分页结果泛型
 */

/** 支持的通知渠道 */
export type NotificationChannel = "in_app" | "email" | "sms" | "wechat"

/** 站内通知类型（message_notifications.type 列） */
export type NotificationType = "message" | "announcement" | "homework" | "grade" | "diagnostic"

/** 通知优先级（message_notifications.priority 列） */
export type NotificationPriority = "low" | "normal" | "high" | "urgent"

/** 站内通知记录（对应 message_notifications 表的展示形态） */
export interface Notification {
  id: string
  userId: string
  type: NotificationType
  title: string
  content: string | null
  link: string | null
  isRead: boolean
  priority: NotificationPriority
  isArchived: boolean
  createdAt: string
}

/** 通知列表项（Notification 的别名，用于列表场景） */
export type NotificationListItem = Notification

/** 通知负载（跨渠道统一格式） */
export interface NotificationPayload {
  userId: string
  title: string
  content: string
  /** 通知语义类型（用于渠道内模板映射，不与 NotificationType 耦合） */
  type: "info" | "warning" | "error" | "success"
  metadata?: Record<string, unknown>
  /** 点击通知后的跳转地址（站内相对路径或外链） */
  actionUrl?: string
}

/** 单次渠道发送结果 */
export interface ChannelSendResult {
  channel: NotificationChannel
  success: boolean
  /** 渠道返回的消息 ID（用于追踪） */
  messageId?: string
  /** 失败时的错误信息 */
  error?: string
  sentAt: Date
}

/** 通用分页结果 */
export interface PaginatedResult<T> {
  items: T[]
  total: number
  page: number
  pageSize: number
  totalPages: number
}

/** 获取站内通知列表的查询参数 */
export interface GetNotificationsParams {
  page?: number
  pageSize?: number
  unreadOnly?: boolean
  /** V2-P2-13b: 仅返回未归档通知（默认 true） */
  unarchivedOnly?: boolean
  /** V2-P2-13b: 按优先级筛选 */
  priority?: NotificationPriority
}

/** 创建站内通知的输入 */
export interface CreateNotificationInput {
  userId: string
  type: NotificationType
  title: string
  content?: string | null
  link?: string | null
  priority?: NotificationPriority
}

/** 通知偏好设置（对应 notification_preferences 表的展示形态） */
export interface NotificationPreferences {
  id: string
  userId: string
  emailEnabled: boolean
  smsEnabled: boolean
  pushEnabled: boolean
  homeworkNotifications: boolean
  gradeNotifications: boolean
  announcementNotifications: boolean
  messageNotifications: boolean
  attendanceNotifications: boolean
  quietHoursEnabled: boolean
  quietHoursStart: string | null
  quietHoursEnd: string | null
  createdAt: string
  updatedAt: string
}

/** 更新通知偏好的输入（部分字段可选，未提供则保留原值） */
export interface UpdateNotificationPreferencesInput {
  emailEnabled?: boolean
  smsEnabled?: boolean
  pushEnabled?: boolean
  homeworkNotifications?: boolean
  gradeNotifications?: boolean
  announcementNotifications?: boolean
  messageNotifications?: boolean
  attendanceNotifications?: boolean
  quietHoursEnabled?: boolean
  quietHoursStart?: string | null
  quietHoursEnd?: string | null
}

/** SMS 渠道配置 */
export interface SmsChannelConfig {
  provider: "aliyun" | "tencent" | "mock"
  accessKeyId?: string
  accessKeySecret?: string
  signName?: string
  templateCode?: string
}

/** 微信公众号渠道配置 */
export interface WechatChannelConfig {
  appId?: string
  appSecret?: string
  templateId?: string
}

/** 邮件渠道配置 */
export interface EmailChannelConfig {
  provider: "resend" | "nodemailer" | "mock"
  apiKey?: string
  from?: string
  host?: string
  port?: number
  user?: string
  pass?: string
}

/** 通知发送日志记录（对应 notification_logs 表的展示形态） */
export interface NotificationLog {
  id: string
  userId: string
  title: string
  channel: NotificationChannel
  status: "success" | "failure"
  messageId: string | null
  error: string | null
  sentAt: string
}

/** 通知渠道总配置 */
export interface NotificationChannelConfig {
  enabled: boolean
  sms?: SmsChannelConfig
  wechat?: WechatChannelConfig
  email?: EmailChannelConfig
}
