/**
 * AI Chat Panel 统一聊天面板类型定义
 *
 * 支持三种模式：
 * - workflow: 工作流编辑器调试模式
 * - agent-debug: 智能体编辑器调试模式
 * - agent-chat: 智能体正式对话模式
 */

import type { ChatMessage, ReasoningStep } from '#/components/ChatBox';

// ==================== 运行模式 ====================

/** 聊天面板运行模式 */
export type ChatPanelMode = 'agent-chat' | 'agent-debug' | 'workflow';

// ==================== 工作流相关类型 ====================

/** 工作流变量定义 */
export interface WorkflowVariable {
  variable: string;
  type: 'boolean' | 'number' | 'string' | 'text';
  required?: boolean;
  default_value?: string;
  description?: string;
}

/** 工作流节点（简化版，用于变量提取） */
export interface WorkflowNode {
  id: string;
  type: string;
  data?: {
    [key: string]: any;
    variables?: WorkflowVariable[];
  };
}

// ==================== Agent 相关类型 ====================

/** Agent 信息（简化版） */
export interface AgentInfo {
  id: string;
  name: string;
  code?: string;
  description?: string;
  avatar?: string;
  status: 'disabled' | 'draft' | 'published';
  mode?: 'autonomous' | 'dialog_flow';
  workflow_id?: null | string;
  workflow_type?: null | string;
  welcome_message?: null | string;
  suggested_questions?: string[];
}

// ==================== 设计预览相关类型 ====================

/** 设计预览类型 */
export type DesignPreviewType =
  | 'agent_capability'
  | 'app_design'
  | 'app_settings'
  | 'dashboard_basic_info'
  | 'dashboard_design'
  | 'dashboard_publish'
  | 'database_design'
  | 'form_basic_info'
  | 'form_ui_design'
  | 'knowledge_retrieval'
  | 'list_config'
  | 'llm_config'
  | 'workflow_result'
  | 'system_summary';

/** 设计预览数据 */
export interface DesignPreviewData {
  type: DesignPreviewType | string;
  title: string;
  data: Record<string, any>;
  nodeId: string;
  data_sources?: any[];
  form_fields?: any[];
  schema_fields?: any[];
  table_configs?: any[];
  layoutOptions?: any[];
  themeOptions?: any[];
}

// ==================== 流式事件类型 ====================

/** 通用流式事件 */
export interface StreamEvent {
  type: string;
  [key: string]: any;
}

/** 节点执行事件 */
export interface NodeEvent {
  node_id: string;
  node_type?: string;
  node_label?: string;
  event_type?: string;
  status?: 'failed' | 'running' | 'success';
  inputs?: Record<string, any>;
  outputs?: Record<string, any>;
  elapsed_time?: number;
  tokens_used?: number;
  error_message?: string;
  loop_iteration?: number;
  warnings?: any[];
}

/** 循环迭代事件 */
export interface LoopIterationEvent {
  node_id: string;
  type: 'complete' | 'error' | 'start';
  iteration: number;
  total: number;
  item?: any;
  output?: any;
  error?: string;
}

// ==================== Props 类型 ====================

/** ChatPanel Props */
export interface AiChatPanelProps {
  // ========== 模式配置 ==========
  /** 运行模式 */
  mode: ChatPanelMode;

  // ========== 工作流模式配置 ==========
  /** 工作流 ID（workflow 模式必填） */
  workflowId?: string;
  /** 工作流节点列表（用于变量提取和节点高亮） */
  nodes?: WorkflowNode[];
  /** 是否使用草稿版本（默认 true） */
  useDraft?: boolean;

  // ========== Agent 模式配置 ==========
  /** Agent ID（agent-* 模式必填） */
  agentId?: string;
  /** Agent 详情（用于欢迎消息、推荐问题） */
  agent?: AgentInfo | null;
  /** 当前对话 ID（agent-chat 模式用于加载历史） */
  conversationId?: null | string;
  /** 初始输入参数 */
  initialInputs?: Record<string, any>;

  // ========== 功能开关 ==========
  /** 是否启用多变量输入表单（默认 workflow 模式启用） */
  enableVariablesForm?: boolean;
  /** 是否启用对话历史加载（默认 agent-chat 模式启用） */
  enableHistory?: boolean;
  /** 是否启用消息反馈（默认 agent-chat 模式启用） */
  enableFeedback?: boolean;
  /** 是否启用欢迎消息（默认 agent-* 模式启用） */
  enableWelcome?: boolean;
  /** 是否启用节点执行事件（用于画布高亮，默认 workflow 模式启用） */
  enableNodeEvents?: boolean;
  /** 是否显示清空按钮 */
  showClearButton?: boolean;
  /** 是否显示关闭按钮 */
  showCloseButton?: boolean;
  /** 是否显示头部 */
  showHeader?: boolean;

  // ========== UI 配置 ==========
  /** 面板标题 */
  title?: string;
  /** 占位符文本 */
  placeholder?: string;
  /** 空状态文本 */
  emptyText?: string;
  /** 是否禁用输入 */
  disabled?: boolean;
  /** 是否启用语音 */
  enableVoice?: boolean;
  /** 是否启用附件 */
  enableAttachment?: boolean;
  /** 是否启用图片 */
  enableImage?: boolean;
  /** 是否显示头像 */
  showAvatar?: boolean;
  /** 助手名称 */
  assistantName?: string;
  /** 布局模式：sidebar-侧边栏固定宽度，fullscreen-全屏响应式 */
  layout?: 'fullscreen' | 'sidebar';
}

// ==================== Emits 类型 ====================

/** ChatPanel Emits */
export interface AiChatPanelEmits {
  // 工作流模式事件
  (e: 'node-start', data: NodeEvent): void;
  (e: 'node-complete', data: NodeEvent): void;
  (
    e: 'node-streaming',
    data: { accumulated_content?: string; content: string; node_id: string },
  ): void;
  (e: 'loop-iteration', data: LoopIterationEvent): void;
  (e: 'clear-status'): void;

  // Agent 模式事件
  (e: 'conversation-created', conversationId: string): void;

  // 通用事件
  (e: 'close'): void;
  (e: 'message-sent', message: string): void;
  (e: 'message-complete', conversationId: null | string): void;
}

// ==================== API 适配器类型 ====================

/** 附件类型 - 通过 file_id 关联文件管理系统 */
export interface Attachment {
  /** 文件管理系统中的文件 ID（新格式） */
  file_id?: string;
  /** 附件 ID（兼容旧格式，等同于 file_id） */
  id?: string;
  /** 附件类型 */
  type: 'audio' | 'file' | 'image' | 'video';
  /** 文件名（可选，用于显示） */
  name?: string;
  /** 文件 URL（可选，用于预览） */
  url?: string;
  /** MIME 类型（可选） */
  mime_type?: string;
  /** 文件大小（可选） */
  size?: number;
  /** 缩略图 URL */
  thumbnail?: string;
}

/** API 适配器接口 */
export interface ChatApiAdapter {
  /** 发送消息 */
  sendMessage: (
    message: string,
    inputs: Record<string, any> | undefined,
    onEvent: (event: StreamEvent) => void,
    onError: (error: Error) => void,
    onComplete: () => void,
    attachments?: Attachment[],
  ) => (() => void) | null;

  /** 恢复执行（对话流模式） */
  resumeExecution: (
    runId: string,
    userInput: any,
    onEvent: (event: StreamEvent) => void,
    onError: (error: Error) => void,
    onComplete: () => void,
  ) => (() => void) | null;

  /** 加载历史消息（仅 agent-chat 模式） */
  loadHistory?: (conversationId: string) => Promise<ChatMessage[]>;

  /** 发送消息反馈（仅 agent-chat 模式） */
  sendFeedback?: (
    messageId: string,
    feedback: 'dislike' | 'like',
  ) => Promise<void>;
}

// ==================== 内部状态类型 ====================

/** 聊天面板内部状态 */
export interface ChatPanelState {
  messages: ChatMessage[];
  running: boolean;
  streamingContent: string;
  currentSteps: ReasoningStep[];
  currentRunId: string;
  currentAssistantMsgId: null | string;
  conversationId: null | string;
  waitingForInput: boolean;
  waitingConfig: any;
}

// ==================== 导出 ====================

export type { ChatMessage, ReasoningStep };
