/**
 * AiChatEvent 类型镜像(对齐 DevFlow 后端 Rust 定义)
 *
 * 类型证据:
 * - Rust 定义:src-tauri/src/commands/ai/mod.rs:105-216 `pub enum AiChatEvent`
 *   (19 个变体,#[serde(tag = "type")] → TS 用 type discriminator 镜像)
 * - Rust 字段 snake_case:Rust 默认 snake_case 字段,TS 直接对齐(不加 camelCase 转换)
 * - 桌面 TS:src/api/types.ts(未在本批核验,但变体名/字段从 Rust 源码逐字对齐)
 *
 * 注意:TS 联合类型 discriminator 名为 `type`,与 Rust #[serde(tag = "type")] 一致。
 *      变体名 PascalCase(Rust enum 变体名原样,serde 默认 PascalCase 序列化)。
 */

// SkillInfo 复用 relay.ts 同协议层定义(`/` 联想浮层渲染 + 选中后 name 透传 SendMessageArgs.skill)
import type { SkillInfo } from './relay'

/** 错误源分类(对齐 Rust ErrorType,mod.rs:89-102,snake_case 序列化) */
export type ErrorType = 'auth' | 'network' | 'timeout' | 'provider_config' | 'unknown'

/** 会话生命周期状态(对齐 Rust ConvState,L2 统一状态机,snake_case 序列化) */
export type ConvState = 'idle' | 'generating' | 'stopping' | 'error' | 'compressed'

/**
 * AI 聊天事件联合类型(19 个变体,严格对齐 Rust mod.rs:107-216)
 *
 * 字段全部对齐 Rust serde(rename_all 默认 snake_case 字段名,tag = "type")。
 * 变体名 PascalCase 来自 Rust enum 变体名(serde 默认 PascalCase 序列化 enum variant)。
 *
 * 注:AiConversationList 的 conversations 字段对齐 Rust ConvSummary(#[serde(rename_all="camelCase")]),
 *     元素结构同本文件 Conversation interface(id/title/lastMessage?/updatedAt?/createdAt?)。
 */
export type AiChatEvent =
  | { type: 'AiTextDelta'; delta: string; conversation_id?: string | null }
  | { type: 'AiToolCallStarted'; id: string; name: string; args: unknown; conversation_id?: string | null }
  | { type: 'AiToolCallCompleted'; id: string; result: unknown; conversation_id?: string | null }
  | { type: 'AiToolAutoApproved'; id: string; tool: string; dir: string; conversation_id?: string | null }
  | {
      type: 'AiApprovalRequired'
      id: string
      name: string
      args: unknown
      reason: string
      diff?: string | null
      conversation_id?: string | null
    }
  | { type: 'AiApprovalResult'; id: string; approved: boolean; conversation_id?: string | null }
  | {
      type: 'AiCompleted'
      total_tokens: number
      prompt_tokens: number
      completion_tokens: number
      incomplete?: boolean | null
      conversation_id?: string | null
    }
  | { type: 'AiError'; error: string; error_type?: ErrorType | null; conversation_id?: string | null }
  | { type: 'AiUserMessage'; message: string; conversation_id?: string | null }
  | { type: 'AiAgentRound'; round: number; conversation_id?: string | null }
  | { type: 'AiHeartbeat'; conversation_id?: string | null }
  | { type: 'AiMaxRoundsReached'; conversation_id?: string | null }
  | { type: 'AiStreamRetry'; attempt: number; max_attempts: number; conversation_id?: string | null }
  | {
      type: 'AiDirAuthRequired'
      id: string
      tool: string
      path: string
      dir: string
      conversation_id?: string | null
    }
  | { type: 'AiContextCleared'; conversation_id?: string | null }
  | { type: 'AiCompressing'; conversation_id?: string | null }
  // 治 Task#1:拆分手动/自动两变体(字段相同仅 type 字面量不同),桌面按 type 分流,
  // miniapp 两变体都插摘要气泡(历史可见性,见 useAiChat.ts:618 case fallthrough)。
  | { type: 'AiManualCompressed'; conversation_id?: string | null; summary: string }
  | { type: 'AiAutoCompressed'; conversation_id?: string | null; summary: string }
  | {
      type: 'AiHelpRequired'
      reason: string
      context: string
      options: string[]
      conversation_id?: string | null
    }
  | { type: 'AiConvStateChanged'; conv_state: ConvState; conversation_id?: string | null }
  | { type: 'AiConversationList'; conversations: Conversation[] }
  | { type: 'AiMessageHistory'; conversation_id: string; messages: ChatMessage[] }
  | { type: 'AiSkillList'; skills: SkillInfo[] }
  | {
      type: 'AiEntityList'
      projects: ProjectRecord[]
      tasks: TaskRecord[]
      ideas: IdeaRecord[]
    }

/** AiChatEvent 的 type 字面量集合(用于 narrowing / 分派) */
export type AiChatEventType = AiChatEvent['type']

/** 会话信息(对齐桌面端 list_conversations 返回结构,字段名 camelCase 兼容桌面 IPC 约定) */
export interface Conversation {
  id: string
  title: string
  /** 最近一条消息摘要(可选) */
  lastMessage?: string
  /** 最近更新时间戳(ms) */
  updatedAt?: number
  /** 创建时间(ms) */
  createdAt?: number
}

/** 本地渲染消息气泡(对齐桌面端 AiMessage 结构,简化为 miniapp 必需字段) */
export interface ChatMessage {
  id: string
  role: 'user' | 'assistant' | 'system'
  content: string
  timestamp: number
  isError?: boolean
  /** 工具调用列表(对齐 AiToolCallInfo) */
  toolCalls?: AiToolCallInfo[]
  /** 不完整标记(AiCompleted{incomplete:true} 对应系统提示气泡) */
  incomplete?: boolean
}

/** 工具调用信息(对齐桌面 useAiEvents.ts:399 的 AiToolCallInfo) */
export interface AiToolCallInfo {
  id: string
  name: string
  args: unknown
  result?: unknown
  status: 'running' | 'completed' | 'failed' | 'pending_approval' | 'rejected'
  reason?: string
  diff?: string
  /** 审批类型(risk 普通 / path 路径授权,对齐后端 ApprovalKind) */
  kind?: 'risk' | 'path'
  dir?: string
  path?: string
}

/** 挂起审批项(复用 AiToolCallInfo 结构,miniapp 不实现审批 UI 仅展示) */
export type PendingApproval = AiToolCallInfo

/** Token 用量(对齐桌面端 state.lastTokenUsage) */
export interface TokenUsage {
  prompt: number
  completion: number
  total: number
}

// ============================================================
// 实体列表类型(F-#95 联想扩展,AiEntityList 事件载荷)
// ============================================================
//
// 精简字段对齐桌面端 src/api/types.ts(后端 Record 全量字段经 Tauri command Serialize 直传,
// miniapp 仅声明联想浮层展示所需字段;多余字段 JSON 解析保留不报错)。
// SkillInfo 从 ./relay 复用(同协议层定义,避免重复)。

/** 项目记录(对齐桌面端 src/api/types.ts:80 ProjectRecord,miniapp 精简版) */
export interface ProjectRecord {
  id: string
  name: string
  description: string
  status: string
  idea_id: string | null
  /** 绑定的本地代码目录绝对路径(null=未绑定) */
  path: string | null
  /** 技术栈 JSON 数组字符串(如 ["rust","vue"],null=未探测) */
  stack: string | null
  created_at: string
  updated_at: string
}

/** 任务记录(对齐桌面端 src/api/types.ts:135 TaskRecord,miniapp 精简版) */
export interface TaskRecord {
  id: string
  project_id: string
  title: string
  description: string
  status: string
  /** 优先级:0=critical, 1=high, 2=medium, 3=low */
  priority: number
  branch_name: string | null
  assignee: string | null
  created_at: string
  updated_at: string
}

/** 灵感记录(对齐桌面端 src/api/types.ts:11 IdeaRecord,miniapp 精简版) */
export interface IdeaRecord {
  id: string
  title: string
  description: string
  status: string
  priority: number
  score: number | null
  tags: string | null
  source: string | null
  created_at: string
  updated_at: string
}
