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

import { Post } from '../../core/entities/Post';

// ==================== 变化类型枚举 ====================

/**
 * 帖子变化类型枚举
 */
export enum PostChangeType {
  /** 新增帖子 */
  ADDED = 'added',
  /** 更新帖子 */
  UPDATED = 'updated',
  /** 删除帖子 */
  DELETED = 'deleted',
}

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

// ==================== 基础接口 ====================

/**
 * 帖子唯一标识接口
 */
export interface PostIdentifier {
  /** 帖子唯一 ID */
  id: string;
  /** 帖子创建时间（可选，用于排序） */
  createdAt?: string;
  /** 更新时间（可选，用于检测变化） */
  updatedAt?: string;
}

/**
 * 单个帖子变化记录
 */
export interface PostChange<T extends PostIdentifier = Post> {
  /** 变化类型 */
  type: PostChangeType;
  /** 帖子数据 */
  post: T;
  /** 变化前的索引位置（用于删除和移动） */
  oldIndex?: number;
  /** 变化后的索引位置（用于新增和移动） */
  newIndex?: number;
  /** 变化的字段（用于更新） */
  changes?: Partial<T>;
}

// ==================== 差异结果接口 ====================

/**
 * Post差异计算结果接口
 */
export interface PostDiffResult<T extends PostIdentifier = Post> {
  /** 新增的帖子 */
  added: T[];
  /** 更新的帖子（包含变化详情） */
  updated: Array<{
    post: T;
    index: number;
    changes: Partial<T>;
  }>;
  /** 删除的帖子 */
  deleted: Array<{
    post: T;
    index: number;
  }>;
  /** 移动的帖子 */
  moved: Array<{
    post: T;
    fromIndex: number;
    toIndex: number;
  }>;
  /** 未变更的帖子 */
  unchanged: T[];
  /** 是否需要重置（变化比例过大时） */
  shouldReset: boolean;
}

// ==================== 更新操作接口 ====================

/**
 * 基础帖子更新操作接口
 */
export interface BasePostUpdate {
  /** 更新类型 */
  type: PostUpdateType;
  /** 更新时间戳 */
  timestamp: number;
  /** 社区 ID（可选） */
  channelId?: string;
  /** 载荷数据（可选，用于合并更新） */
  payload?: Record<string, any>;
}

/**
 * 添加单条帖子更新
 */
export interface AddPostUpdate extends BasePostUpdate {
  type: PostUpdateType.ADD;
  /** 帖子数据 */
  post: PostIdentifier;
  /** 插入位置索引（可选，默认追加到末尾） */
  index?: number;
}

/**
 * 更新单条帖子更新
 */
export interface UpdatePostUpdate extends BasePostUpdate {
  type: PostUpdateType.UPDATE;
  /** 帖子 ID */
  postId: string;
  /** 更新的字段 */
  updates: Partial<PostIdentifier>;
}

/**
 * 删除单条帖子更新
 */
export interface DeletePostUpdate extends BasePostUpdate {
  type: PostUpdateType.DELETE;
  /** 帖子 ID */
  postId: string;
}

/**
 * 移动帖子更新
 */
export interface MovePostUpdate extends BasePostUpdate {
  type: PostUpdateType.MOVE;
  /** 帖子 ID */
  postId: string;
  /** 目标位置索引 */
  toIndex: number;
}

/**
 * 批量添加帖子更新
 */
export interface BatchAddPostUpdate extends BasePostUpdate {
  type: PostUpdateType.BATCH_ADD;
  /** 帖子列表 */
  posts: PostIdentifier[];
  /** 插入位置索引（可选，默认追加到末尾） */
  startIndex?: number;
}

/**
 * 批量更新帖子更新
 */
export interface BatchUpdatePostUpdate extends BasePostUpdate {
  type: PostUpdateType.BATCH_UPDATE;
  /** 批量更新项 */
  updates: Array<{
    postId: string;
    changes: Partial<PostIdentifier>;
  }>;
}

/**
 * 批量删除帖子更新
 */
export interface BatchDeletePostUpdate extends BasePostUpdate {
  type: PostUpdateType.BATCH_DELETE;
  /** 要删除的帖子 ID 列表 */
  postIds: string[];
}

/**
 * 重置帖子列表更新
 */
export interface ResetPostUpdate extends BasePostUpdate {
  type: PostUpdateType.RESET;
  /** 新的帖子列表 */
  posts: PostIdentifier[];
}

/**
 * 帖子更新联合类型
 */
export type PostUpdate =
  | AddPostUpdate
  | UpdatePostUpdate
  | DeletePostUpdate
  | MovePostUpdate
  | BatchAddPostUpdate
  | BatchUpdatePostUpdate
  | BatchDeletePostUpdate
  | ResetPostUpdate;

// ==================== 批量更新接口 ====================

/**
 * Post批量更新类型
 */
export interface PostUpdateBatch {
  /** 批次 ID */
  batchId: string;
  /** 更新列表 */
  updates: PostUpdate[];
  /** 创建时间戳 */
  createdAt: number;
  /** 是否已处理 */
  processed: boolean;
}

// ==================== 配置接口 ====================

/**
 * Post差异配置接口
 */
export interface PostDiffConfig {
  /** 批量处理间隔（毫秒），默认 16ms（60fps） */
  batchInterval?: number;
  /** 最大批量大小，默认 50 */
  maxBatchSize?: number;
  /** 是否启用去重，默认 true */
  enableDeduplication?: boolean;
  /** 是否合并相同帖子的多次更新，默认 true */
  enableMerge?: boolean;
  /** 帖子唯一标识字段，默认 'id' */
  idField?: string;
  /** 排序字段，默认 'createdAt' */
  sortField?: string;
  /** 变化比例阈值，超过此值触发重置，默认 0.5 */
  resetThreshold?: number;
  /** 是否检测部分字段更新 */
  detectPartialUpdates?: boolean;
  /** 需要检测变化的字段列表 */
  trackedFields?: (keyof Post)[];
}

/**
 * 默认Post差异配置常量
 */
export const DEFAULT_POST_DIFF_CONFIG: Required<PostDiffConfig> = {
  batchInterval: 16,
  maxBatchSize: 50,
  enableDeduplication: true,
  enableMerge: true,
  idField: 'id',
  sortField: 'createdAt',
  resetThreshold: 0.5,
  detectPartialUpdates: true,
  trackedFields: [
    'likesCount',
    'commentsCount',
    'sharesCount',
    'viewsCount',
    'favoritesCount',
    'isLiked',
    'isFavorited',
    'isPinned',
    'status',
    'title',
    'content',
    'images',
    'tags',
  ],
};

// ==================== 监听器类型 ====================

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

/**
 * Post比较函数类型
 */
export type PostComparator<T extends PostIdentifier> = (a: T, b: T) => boolean;

/**
 * Post排序函数类型
 */
export type PostSorter<T extends PostIdentifier> = (a: T, b: T) => number;

// ==================== 统计接口 ====================

/**
 * Post差异统计接口
 */
export interface PostDiffStats {
  /** 总批次数 */
  totalBatches: number;
  /** 总更新数 */
  totalUpdates: number;
  /** 平均批量大小 */
  averageBatchSize: number;
  /** 上次批次时间 */
  lastBatchTime: number;
  /** 新增帖子数 */
  addedCount: number;
  /** 更新帖子数 */
  updatedCount: number;
  /** 删除帖子数 */
  deletedCount: number;
}