import { v4 as uuidv4 } from 'uuid';

/**
 * 知识块实体 - 将文章拆分为更小的检索单元
 * 用于RAG检索时提高精确度
 */
export class KnowledgeChunkEntity {
  id: string;

  /** 所属文章ID */
  articleId: string;

  /** 块内容 */
  content: string;

  /** 块序号（在文章中的位置） */
  chunkIndex: number;

  /** 块类型 */
  chunkType: ChunkType;

  /** 内容向量 */
  embedding?: number[];

  /** 元数据（如标题层级、列表项等） */
  metadata: ChunkMetadata;

  /** Token数量（估算） */
  tokenCount: number;

  createdAt: Date;

  private constructor() {}

  static create(params: {
    articleId: string;
    content: string;
    chunkIndex: number;
    chunkType: ChunkType;
    metadata?: ChunkMetadata;
  }): KnowledgeChunkEntity {
    const chunk = new KnowledgeChunkEntity();
    chunk.id = uuidv4();
    chunk.articleId = params.articleId;
    chunk.content = params.content;
    chunk.chunkIndex = params.chunkIndex;
    chunk.chunkType = params.chunkType;
    chunk.metadata = params.metadata || {};
    chunk.tokenCount = KnowledgeChunkEntity.estimateTokens(params.content);
    chunk.createdAt = new Date();
    return chunk;
  }

  static fromPersistence(data: Partial<KnowledgeChunkEntity>): KnowledgeChunkEntity {
    const chunk = new KnowledgeChunkEntity();
    Object.assign(chunk, data);
    return chunk;
  }

  /**
   * 估算Token数量（简单估算：中文字符约1.5token，英文单词约1.3token）
   */
  private static estimateTokens(content: string): number {
    const chineseChars = (content.match(/[\u4e00-\u9fa5]/g) || []).length;
    const englishWords = (content.match(/[a-zA-Z]+/g) || []).length;
    return Math.ceil(chineseChars * 1.5 + englishWords * 1.3);
  }

  /**
   * 设置向量
   */
  setEmbedding(embedding: number[]): void {
    this.embedding = embedding;
  }
}

export enum ChunkType {
  TITLE = 'TITLE',           // 标题
  PARAGRAPH = 'PARAGRAPH',   // 段落
  LIST = 'LIST',             // 列表
  TABLE = 'TABLE',           // 表格
  CODE = 'CODE',             // 代码块
  FAQ = 'FAQ',               // 问答对
}

export interface ChunkMetadata {
  /** 所属章节标题 */
  sectionTitle?: string;
  /** 标题层级 */
  headingLevel?: number;
  /** 是否包含重要关键词 */
  hasKeywords?: boolean;
  /** 前一个块ID（用于上下文） */
  prevChunkId?: string;
  /** 后一个块ID */
  nextChunkId?: string;
}
