/**
 * 差异更新类型定义
 * 用于消息列表的增量更新，减少 UI 重渲染次数
 */

/**
 * 消息更新类型枚举
 */
export enum MessageUpdateType {
  /** 添加单条消息 */
  ADD = 'ADD',
  /** 更新单条消息 */
  UPDATE = 'UPDATE',
  /** 删除单条消息 */
  DELETE = 'DELETE',
  /** 移动消息位置 */
  MOVE = 'MOVE',
  /** 批量添加 */
  BATCH_ADD = 'BATCH_ADD',
  /** 批量更新 */
  BATCH_UPDATE = 'BATCH_UPDATE',
  /** 批量删除 */
  BATCH_DELETE = 'BATCH_DELETE',
  /** 重置整个列表 */
  RESET = 'RESET',
}

/**
 * 消息唯一标识接口
 */
export interface MessageIdentifier {
  /** 消息唯一 ID */
  id: string;
  /** 消息序列号（可选，用于排序） */
  seq?: number;
}

/**
 * 基础更新操作接口
 */
export interface BaseMessageUpdate {
  /** 更新类型 */
  type: MessageUpdateType;
  /** 更新时间戳 */
  timestamp: number;
  /** 会话 ID（可选） */
  conversationId?: string;
  /** 载荷数据（可选，用于合并更新） */
  payload?: Record<string, any>;
}

/**
 * 添加单条消息更新
 */
export interface AddMessageUpdate extends BaseMessageUpdate {
  type: MessageUpdateType.ADD;
  /** 消息数据 */
  message: MessageIdentifier;
  /** 插入位置索引（可选，默认追加到末尾） */
  index?: number;
}

/**
 * 更新单条消息更新
 */
export interface UpdateMessageUpdate extends BaseMessageUpdate {
  type: MessageUpdateType.UPDATE;
  /** 消息 ID */
  messageId: string;
  /** 更新的字段 */
  updates: Partial<MessageIdentifier>;
}

/**
 * 删除单条消息更新
 */
export interface DeleteMessageUpdate extends BaseMessageUpdate {
  type: MessageUpdateType.DELETE;
  /** 消息 ID */
  messageId: string;
}

/**
 * 移动消息更新
 */
export interface MoveMessageUpdate extends BaseMessageUpdate {
  type: MessageUpdateType.MOVE;
  /** 消息 ID */
  messageId: string;
  /** 目标位置索引 */
  toIndex: number;
}

/**
 * 批量添加消息更新
 */
export interface BatchAddMessageUpdate extends BaseMessageUpdate {
  type: MessageUpdateType.BATCH_ADD;
  /** 消息列表 */
  messages: MessageIdentifier[];
  /** 插入位置索引（可选，默认追加到末尾） */
  startIndex?: number;
}

/**
 * 批量更新消息更新
 */
export interface BatchUpdateMessageUpdate extends BaseMessageUpdate {
  type: MessageUpdateType.BATCH_UPDATE;
  /** 批量更新项 */
  updates: Array<{
    messageId: string;
    changes: Partial<MessageIdentifier>;
  }>;
}

/**
 * 批量删除消息更新
 */
export interface BatchDeleteMessageUpdate extends BaseMessageUpdate {
  type: MessageUpdateType.BATCH_DELETE;
  /** 要删除的消息 ID 列表 */
  messageIds: string[];
}

/**
 * 重置消息列表更新
 */
export interface ResetMessageUpdate extends BaseMessageUpdate {
  type: MessageUpdateType.RESET;
  /** 新的消息列表 */
  messages: MessageIdentifier[];
}

/**
 * 消息更新联合类型
 */
export type MessageUpdate =
  | AddMessageUpdate
  | UpdateMessageUpdate
  | DeleteMessageUpdate
  | MoveMessageUpdate
  | BatchAddMessageUpdate
  | BatchUpdateMessageUpdate
  | BatchDeleteMessageUpdate
  | ResetMessageUpdate;

/**
 * 差异配置接口
 */
export interface DiffConfig {
  /** 批量处理间隔（毫秒），默认 16ms（60fps） */
  batchInterval?: number;
  /** 最大批量大小，默认 100 */
  maxBatchSize?: number;
  /** 是否启用去重，默认 true */
  enableDeduplication?: boolean;
  /** 是否合并相同消息的多次更新，默认 true */
  enableMerge?: boolean;
  /** 消息唯一标识字段，默认 'id' */
  idField?: string;
  /** 排序字段，默认 'seq' */
  sortField?: string;
}

/**
 * 差异计算结果接口
 */
export interface DiffResult<T extends MessageIdentifier> {
  /** 新增的消息 */
  added: T[];
  /** 更新的消息 */
  updated: Array<{ message: T; index: number; changes: Partial<T> }>;
  /** 删除的消息 */
  deleted: Array<{ message: T; index: number }>;
  /** 移动的消息 */
  moved: Array<{ message: T; fromIndex: number; toIndex: number }>;
  /** 未变更的消息 */
  unchanged: T[];
  /** 是否需要重置 */
  shouldReset: boolean;
}

/**
 * 批量更新监听器类型
 */
export type BatchUpdateListener = (updates: MessageUpdate[]) => void;

/**
 * 消息比较函数类型
 */
export type MessageComparator<T extends MessageIdentifier> = (a: T, b: T) => boolean;

/**
 * 消息排序函数类型
 */
export type MessageSorter<T extends MessageIdentifier> = (a: T, b: T) => number;

/**
 * 默认配置常量
 */
export const DEFAULT_DIFF_CONFIG: Required<DiffConfig> = {
  batchInterval: 16,
  maxBatchSize: 100,
  enableDeduplication: true,
  enableMerge: true,
  idField: 'id',
  sortField: 'seq',
};
