/**
 * @description AI模块类型定义
 * @author AI Assistant
 * @since 2025-11-04
 */

import { BaseDTO } from '../base';
import { PageParam } from '../base';

/**
 * 智能体配置实体
 */
export interface AiAgentConfig extends BaseDTO {
  /** 智能体名称 */
  name?: string;
  /** 智能体头像 */
  avatar?: string;
  /** 智能体描述 */
  description?: string;
  /** 系统提示词 */
  systemPrompt?: string;
  /** 是否连接互联网（0否 1是） */
  connectInternet?: number;
  /** 模型名称 */
  modelName?: string;
  /** 模型提供商 */
  modelProvider?: string;
  /** 温度值（0.0-1.0） */
  temperature?: number;
  /** 最大tokens */
  maxTokens?: number;
  /** Top P值 */
  topP?: number;
  /** Dify应用ID */
  difyAppId?: string;
  /** Dify API Key */
  difyApiKey?: string;
  /** 状态（0禁用 1启用） */
  status?: number;
  /** 创建者 */
  creator?: string;
  /** 更新者 */
  updater?: string;
}

/**
 * AI知识库实体
 */
export interface AiKnowledge extends BaseDTO {
  /** 知识库标题 */
  title?: string;
  /** 知识库头像 */
  avatar?: string;
  /** 知识库描述 */
  description?: string;
  /** 内容 */
  content?: string;
  /** 来源类型 */
  sourceType?: number;
  /** 来源ID */
  sourceID?: string;
  /** 文件名 */
  fileName?: string;
  /** 文件路径 */
  filePath?: string;
  /** 分类 */
  category?: string;
  /** 标签 */
  tags?: string;
  /** Dify数据集ID */
  difyDatasetId?: string;
  /** Dify索引方式（high_quality=高质量, economy=经济） */
  difyIndexingTechnique?: string;
  /** Embedding模型 */
  embeddingModel?: string;
  /** Embedding模型提供商 */
  embeddingModelProvider?: string;
  /** Rerank模型 */
  rerankModel?: string;
  /** Rerank模型提供商 */
  rerankModelProvider?: string;
  /** 是否启用Rerank */
  rerankingEnable?: boolean;
  /** 检索Top K（返回前K个结果） */
  retrievalTopK?: number;
  /** 检索分数阈值（0.00-1.00） */
  retrievalScoreThreshold?: number;
  /** 向量ID */
  vectorID?: string;
  /** 文档数量 */
  documentCount?: number;
  /** 总分段数 */
  totalChunks?: number;
  /** 状态（0禁用 1启用） */
  status?: number;
  /** 创建者 */
  creator?: string;
  /** 创建者部门 */
  creatorDept?: string;
  /** 更新者 */
  updater?: string;
  /** 是否可读 */
  canRead?: boolean;
  /** 是否可写（修改知识库和文档） */
  canWrite?: boolean;
  /** 是否可删除（删除知识库和文档） */
  canDelete?: boolean;
  /** 权限类型（all/department/role等） */
  permissionType?: string;
}

/**
 * AI上传文件实体
 */
export interface AiUploadFile extends BaseDTO {
  /** 知识库ID */
  knowledgeId?: string;
  /** 系统文件ID（关联tb_sys_file） */
  sysFileId?: string;
  /** 文件名 */
  fileName?: string;
  /** 文件路径 */
  filePath?: string;
  /** 文件大小（字节） */
  fileSize?: number;
  /** 文件类型（MIME类型） */
  fileType?: string;
  /** Dify文档ID */
  difyDocumentId?: string;
  /** Dify批次ID */
  difyBatchId?: string;
  /** 上传状态（0处理中 1成功 2失败） */
  uploadStatus?: number;
  /** 向量化状态（0待处理 1处理中 2已完成 3失败） */
  vectorStatus?: number;
  /** 状态（1处理中 2已完成 3失败） */
  status?: number;
  /** 分片数 */
  segmentCount?: number;
  /** 分段数（tokens） */
  chunkCount?: number;
  /** 错误信息 */
  errorMessage?: string;
  /** 是否启用 */
  enabled?: boolean;
  /** 显示状态 */
  displayStatus?: string;
}

/**
 * 对话会话实体
 */
export interface AiConversation extends BaseDTO {
  /** 用户ID */
  userID?: string;
  /** 智能体ID */
  agentID?: string;
  /** 会话标题 */
  title?: string;
  /** 会话摘要 */
  summary?: string;
  /** Dify会话ID */
  difyConversationId?: string;
  /** 状态（0已结束 1进行中） */
  status?: number;
  /** 是否收藏 */
  isFavorite?: boolean;
  /** 是否置顶 */
  isPinned?: boolean;
  /** 消息数量 */
  messageCount?: number;
  /** Token总数 */
  totalTokens?: number;
  /** 最后消息时间 */
  lastMessageTime?: string;
}

/**
 * 对话消息实体
 */
export interface AiMessage extends BaseDTO {
  /** 会话ID */
  conversationID?: string;
  /** 用户ID */
  userID?: string;
  /** 智能体ID */
  agentID?: string;
  /** 角色（user用户 assistant助手 system系统） */
  role?: string;
  /** 消息内容 */
  content?: string;
  /** 关联文件ID（JSON数组） */
  fileIDs?: string;
  /** 关联文件列表（前端附加，用于显示文件详情） */
  files?: AiUploadFile[];
  /** 引用知识ID（JSON数组） */
  knowledgeIDs?: string;
  /** 知识库引用详情（JSON数组） */
  knowledgeRefs?: string;
  /** Token数量 */
  tokenCount?: number;
  /** Dify消息ID */
  difyMessageId?: string;
  /** 评分（1=好评，-1=差评） */
  rating?: number;
  /** 反馈内容 */
  feedback?: string;
}

/**
 * AI使用统计实体
 */
export interface AiUsageStatistics extends BaseDTO {
  /** 用户ID */
  userID?: string;
  /** 智能体ID */
  agentID?: string;
  /** 统计日期 */
  statisticsDate?: string;
  /** 对话次数 */
  conversationCount?: number;
  /** 消息数量 */
  messageCount?: number;
  /** Token使用量 */
  tokenUsage?: number;
  /** 知识库查询次数 */
  knowledgeQueryCount?: number;
  /** 文件上传次数 */
  fileUploadCount?: number;
}

/**
 * 对话请求参数
 */
export interface ChatRequest {
  /** 智能体ID */
  agentId: string;
  /** 会话ID（可选，为空则创建新会话） */
  conversationId?: string;
  /** 用户问题 */
  query: string;
  /** 是否流式返回 */
  stream?: boolean;
  fileIDs?: string;
  /** 上传的文件列表（Dify文件信息） */
  files?: Array<{
    type: string;
    transfer_method: string;
    upload_file_id: string;
  }>;
}

/**
 * 对话响应参数
 */
export interface ChatResponse {
  /** 消息ID */
  messageId?: string;
  /** 会话ID */
  conversationId?: string;
  /** 消息内容 */
  content?: string;
  /** Token使用量 */
  tokenUsage?: number;
  /** 是否完成 */
  isComplete?: boolean;
}

/**
 * 文件上传响应
 */
export interface FileUploadResponse {
  /** 文件ID */
  fileId?: string;
  /** 文件名 */
  fileName?: string;
  /** 文件大小 */
  fileSize?: number;
  /** 处理状态 */
  status?: number;
  /** Dify文档ID */
  difyDocumentId?: string;
}

/**
 * 会话搜索参数
 */
export interface ConversationSearchParams {
  /** 智能体ID（可选） */
  agentId?: string;
  /** 关键词 */
  keyword?: string;
  /** 是否收藏（可选） */
  isFavorite?: boolean;
  /** 开始日期 */
  startDate?: string;
  /** 结束日期 */
  endDate?: string;
  /** 分页参数 */
  pageParam?: PageParam;
}

/**
 * 消息搜索参数
 */
export interface MessageSearchParams {
  /** 关键词 */
  keyword: string;
  /** 会话ID（可选，限定范围） */
  conversationId?: string;
  /** 分页参数 */
  pageParam?: PageParam;
}

/**
 * 用户对话统计
 */
export interface UserChatStatistics {
  /** 会话总数 */
  totalConversations?: number;
  /** 消息总数 */
  totalMessages?: number;
  /** Token总数 */
  totalTokens?: number;
  /** 收藏会话数 */
  favoriteConversations?: number;
  /** 最近活跃会话数（7天） */
  recentActiveConversations?: number;
}

/**
 * 会话统计详情
 */
export interface ConversationStatistics {
  /** 会话ID */
  conversationId?: string;
  /** 标题 */
  title?: string;
  /** 消息数量 */
  messageCount?: number;
  /** Token总数 */
  totalTokens?: number;
  /** 创建时间 */
  createTime?: string;
  /** 最后消息时间 */
  lastMessageTime?: string;
  /** 用户消息数 */
  userMessageCount?: number;
  /** AI回复数 */
  assistantMessageCount?: number;
  /** 评分分布 */
  ratingDistribution?: Array<{ rating: number; count: number }>;
  /** 反馈数量 */
  feedbackCount?: number;
}

/**
 * 批量导出参数
 */
export interface BatchExportParams {
  /** 会话ID列表 */
  conversationIds: string[];
  /** 格式（markdown/json） */
  format: 'markdown' | 'json';
}

/**
 * 知识库权限参数
 */
export interface KnowledgePermissionParams {
  /** 知识库ID */
  knowledgeId: string;
  /** 部门ID列表 */
  deptIds: string[];
  /** 角色ID列表 */
  roleIds: string[];
}

/**
 * Streaming 回调接口
 */
export interface StreamCallback {
  /** 开始连接 */
  onStart?: (eventSource: EventSource) => void;
  /** 初始化数据（包含messageId用于停止生成） */
  onInit?: (initData: { messageId: string; conversationId: string }) => void;
  /** 接收到消息片段 */
  onMessage?: (message: string) => void;
  /** 消息结束 */
  onMessageEnd?: (metadata: string) => void;
  /** 完成 */
  onComplete?: () => void;
  /** 错误 */
  onError?: (error: Error) => void;
  /** Dify原始事件回调（包含task_id等完整信息） */
  onDifyEvent?: (eventType: string, eventData: any) => void;
}

/**
 * Dify事件数据接口
 */
export interface DifyEvent {
  /** 事件类型 */
  event: string;
  /** 任务ID */
  task_id?: string;
  /** 工作流运行ID */
  workflow_run_id?: string;
  /** 消息ID */
  message_id?: string;
  /** 会话ID */
  conversation_id?: string;
  /** 创建时间戳 */
  created_at?: number;
  /** 其他字段 */
  [key: string]: any;
}

// ==================== Dify 文档分段相关类型 ====================

/**
 * Dify 分段（父级）
 */
export interface DifySegment {
  /** 分段ID */
  id: string;
  /** 位置序号 */
  position: number;
  /** 文档ID */
  document_id: string;
  /** 分段内容 */
  content: string;
  /** 字数 */
  word_count: number;
  /** Token数 */
  tokens: number;
  /** 关键词列表 */
  keywords: string[];
  /** 索引节点ID */
  index_node_id: string;
  /** 索引节点哈希 */
  index_node_hash: string;
  /** 命中次数 */
  hit_count: number;
  /** 是否启用 */
  enabled: boolean;
  /** 禁用时间 */
  disabled_at?: number;
  /** 禁用者 */
  disabled_by?: string;
  /** 状态 */
  status: string;
  /** 创建者ID */
  created_by: string;
  /** 创建时间（时间戳） */
  created_at: number;
  /** 索引开始时间 */
  indexing_at?: number;
  /** 完成时间 */
  completed_at?: number;
  /** 错误信息 */
  error?: string;
  /** 停止时间 */
  stopped_at?: number;
}

/**
 * Dify 子块（分段内容块）
 */
export interface DifyChildChunk {
  /** 子块ID */
  id: string;
  /** 父分段ID */
  segment_id: string;
  /** 分段内容 */
  content: string;
  /** 字数 */
  word_count: number;
  /** Token数 */
  tokens: number;
  /** 索引节点ID */
  index_node_id: string;
  /** 索引节点哈希 */
  index_node_hash: string;
  /** 状态 */
  status: string;
  /** 创建者ID */
  created_by: string;
  /** 创建时间（时间戳） */
  created_at: number;
  /** 索引开始时间 */
  indexing_at?: number;
  /** 完成时间 */
  completed_at?: number;
  /** 错误信息 */
  error?: string;
  /** 停止时间 */
  stopped_at?: number;
}

/**
 * Dify 分段列表响应
 */
export interface DifySegmentListResponse {
  /** 分段数据列表 */
  data: DifySegment[];
}

/**
 * Dify 子块列表响应
 */
export interface DifyChildChunkListResponse {
  /** 子块数据列表 */
  data: DifyChildChunk[];
}

/**
 * Dify 子块单个响应
 */
export interface DifyChildChunkResponse {
  /** 子块数据 */
  data: DifyChildChunk;
}

/**
 * 分段更新请求
 */
export interface SegmentUpdateRequest {
  /** 更新的内容 */
  content: string;
}

/**
 * 分段创建请求
 */
export interface SegmentCreateRequest {
  /** 分段内容 */
  content: string;
}