use serde::{Deserialize, Serialize};

// ============================================================
// 知识库配置(提取 + 注入)
// ============================================================

/// AI 提炼触发方式
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum ExtractTrigger {
    /// 对话正常完成时(默认)
    OnComplete,
    /// 仅手动按钮触发
    ManualOnly,
}

/// 知识库配置持久化 KV key(P0 设置走查-2026-06-21:原纯内存 Arc<Mutex> 启动 default 覆盖
/// 致 8 项配置重启全丢;save_config 落此 KV,init reload_knowledge_config 恢复)。
/// 知识库配置持久化 KV key(P0 设置走查-2026-06-21:原纯内存 Arc<Mutex> 启动 default 覆盖
/// 致 8 项配置重启全丢;save_config 落此 KV,init reload_knowledge_config 恢复)。
pub const KNOWLEDGE_CONFIG_KEY: &str = "df-knowledge-config";

/// 审批超时配置持久化 KV key(前端 AdvancedSection.vue 也在用同一个 key,保持单一真相源)。
/// 前端值单位为毫秒(0/300000/900000/1800000/3600000),后端同步使用此 key 读取并转换。
/// 前端在运行期负责会话内的审批超时(定时器+ai_approve(false)),后端在启动恢复阶段
/// 清理重启前遗留的 pending(避免重启后无人调用 try_continue 致审批永不超时)。
pub const APPROVAL_TIMEOUT_KEY: &str = "df-approval-timeout";

/// 知识库行为配置(内存真相源 + Settings KV 持久化,前后端通过 IPC 读写)
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct KnowledgeConfig {
    /// 提炼总开关,默认 true
    pub auto_extract: bool,
    /// 提炼触发方式,默认 OnComplete
    pub trigger_mode: ExtractTrigger,
    /// 最少消息数守卫(防闲聊噪音),默认 4
    pub min_messages: u32,
    /// 聊天时自动注入相关知识开关,默认 true
    pub auto_inject: bool,
    /// 语义检索(向量)总开关,默认 false——关闭时纯 LIKE 零外部依赖
    #[serde(default)]
    pub vector_enabled: bool,
    /// embedding 用的 provider id(仅 openai_compat 类型,Anthropic 无 embed API)
    #[serde(default)]
    pub embedding_provider_id: Option<String>,
    /// embedding 模型名(如 embedding-3 / text-embedding-3-small)
    #[serde(default)]
    pub embedding_model: Option<String>,
}

impl Default for KnowledgeConfig {
    fn default() -> Self {
        Self {
            auto_extract: true,
            trigger_mode: ExtractTrigger::OnComplete,
            min_messages: 4,
            auto_inject: true,
            vector_enabled: false,
            embedding_provider_id: None,
            embedding_model: None,
        }
    }
}
