-- AI Chat Service 数据库迁移
-- 创建人设表、用户记忆表、配置表

-- ============================================
-- 1. ai_personas 表 - 人设表
-- 存储用户创建的 AI 聊天人设配置
-- ============================================
CREATE TABLE IF NOT EXISTS ai_personas (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),                    -- 人设唯一标识符
    user_id BIGINT NOT NULL,                                          -- 所属用户 ID
    name VARCHAR(64) NOT NULL,                                        -- 人设名称
    description TEXT,                                                 -- 人设描述/简介
    avatar_url VARCHAR(512),                                          -- 头像 URL
    talk_style VARCHAR(256),                                          -- 说话风格描述
    system_prompt TEXT NOT NULL,                                      -- 系统提示词（人设核心定义）
    is_default BOOLEAN DEFAULT FALSE,                                 -- 是否为默认人设
    created_at BIGINT NOT NULL DEFAULT EXTRACT(EPOCH FROM NOW()) * 1000,  -- 创建时间（毫秒时间戳）
    updated_at BIGINT NOT NULL DEFAULT EXTRACT(EPOCH FROM NOW()) * 1000   -- 更新时间（毫秒时间戳）
);

-- 索引
CREATE INDEX IF NOT EXISTS idx_ai_personas_user_id ON ai_personas(user_id);
CREATE UNIQUE INDEX IF NOT EXISTS idx_ai_personas_user_default ON ai_personas(user_id) WHERE is_default = TRUE;

-- ============================================
-- 2. ai_user_memories 表 - 用户长期记忆表
-- 存储用户的长期记忆信息，用于 AI 对话时召回
-- ============================================
CREATE TABLE IF NOT EXISTS ai_user_memories (
    id SERIAL PRIMARY KEY,                                                 -- 记忆唯一标识符
    user_id BIGINT NOT NULL,                                                -- 所属用户 ID
    content TEXT NOT NULL,                                                  -- 记忆内容
    keywords TEXT[],                                                        -- 关键词数组（用于检索）
    weight INTEGER DEFAULT 50,                                               -- 权重（0-100，影响召回优先级）
    is_core BOOLEAN DEFAULT FALSE,                                          -- 是否为核心记忆（核心记忆优先召回）
    created_at BIGINT NOT NULL DEFAULT EXTRACT(EPOCH FROM NOW()) * 1000,     -- 创建时间
    updated_at BIGINT NOT NULL DEFAULT EXTRACT(EPOCH FROM NOW()) * 1000     -- 更新时间
);

-- 索引
CREATE INDEX IF NOT EXISTS idx_ai_user_memories_user_id ON ai_user_memories(user_id);
CREATE INDEX IF NOT EXISTS idx_ai_user_memories_keywords ON ai_user_memories USING GIN(keywords);
CREATE INDEX IF NOT EXISTS idx_ai_user_memories_weight ON ai_user_memories(weight DESC);

-- ============================================
-- 3. ai_chat_configs 表 - AI Chat 配置表
-- 存储 AI Chat 服务的各类配置项
-- ============================================
CREATE TABLE IF NOT EXISTS ai_chat_configs (
    id SERIAL PRIMARY KEY,                                                          -- 配置项唯一 ID
    config_key VARCHAR(128) NOT NULL UNIQUE,                                        -- 配置键
    config_value TEXT NOT NULL,                                                      -- 配置值
    config_type VARCHAR(32) NOT NULL DEFAULT 'string',                              -- 配置类型（string/number/boolean/json）
    category VARCHAR(64) NOT NULL,                                                  -- 配置分类（redis/llm/dialog/token/circuit/summary）
    description VARCHAR(256),                                                        -- 配置描述
    is_encrypted BOOLEAN DEFAULT FALSE,                                             -- 是否加密存储（加密字段不返回明文）
    updated_at BIGINT NOT NULL DEFAULT EXTRACT(EPOCH FROM NOW()) * 1000,            -- 更新时间
    created_at BIGINT NOT NULL DEFAULT EXTRACT(EPOCH FROM NOW()) * 1000             -- 创建时间
);

-- 索引
CREATE INDEX IF NOT EXISTS idx_ai_chat_configs_category ON ai_chat_configs(category);
CREATE INDEX IF NOT EXISTS idx_ai_chat_configs_key ON ai_chat_configs(config_key);

-- 初始配置数据
INSERT INTO ai_chat_configs (config_key, config_value, config_type, category, description, is_encrypted) VALUES
-- Redis 配置
('redis.host', '127.0.0.1', 'string', 'redis', 'Redis 主机地址', FALSE),
('redis.port', '6379', 'number', 'redis', 'Redis 端口', FALSE),
('redis.password', '123456', 'string', 'redis', 'Redis 密码', TRUE),
('redis.db', '0', 'number', 'redis', 'Redis 数据库编号', FALSE),

-- MiniMax 大模型配置
('minimax.api_key', '', 'string', 'llm', 'MiniMax API Key', TRUE),
('minimax.api_url', 'https://api.minimaxi.com/v1', 'string', 'llm', 'MiniMax API 地址', FALSE),
('minimax.model', 'M2-her', 'string', 'llm', 'MiniMax 模型名称', FALSE),

-- 通义备用模型配置
('qwen.api_key', '', 'string', 'llm', '通义 API Key', TRUE),
('qwen.api_url', 'https://dashscope.aliyuncs.com/compatible-mode/v1', 'string', 'llm', '通义 API 地址', FALSE),
('qwen.model', 'qwen-plus', 'string', 'llm', '通义模型名称', FALSE),

-- 对话配置
('dialog.max_context_turns', '10', 'number', 'dialog', '最大上下文轮数', FALSE),
('dialog.context_expire_seconds', '86400', 'number', 'dialog', '上下文过期时间(秒)', FALSE),
('dialog.memory_recall_topn', '5', 'number', 'dialog', '记忆召回返回条数', FALSE),
('dialog.fallback_threshold', '3', 'number', 'dialog', '模型降级连续失败次数阈值', FALSE),
('dialog.slow_response_ms', '5000', 'number', 'dialog', '慢响应判定阈值(毫秒)', FALSE),

-- AI Token 限制配置
('token.max_total', '32000', 'number', 'token', '总 Token 上限', FALSE),
('token.max_history', '24000', 'number', 'token', '对话历史最大 Token', FALSE),
('token.max_system', '4000', 'number', 'token', 'System Prompt 最大 Token', FALSE),
('token.max_memory', '2000', 'number', 'token', '记忆召回最大 Token', FALSE),
('token.reserved', '2000', 'number', 'token', '保留空间 Token', FALSE),

-- 熔断配置
('circuit.max_fail_count', '5', 'number', 'circuit', '熔断连续失败次数', FALSE),
('circuit.breaker_timeout', '60', 'number', 'circuit', '熔断恢复超时(秒)', FALSE),

-- 摘要配置
('summary.trigger_turns', '10', 'number', 'summary', '自动摘要触发轮数', FALSE),
('summary.max_length', '100', 'number', 'summary', '摘要最大字数', FALSE)
ON CONFLICT (config_key) DO NOTHING;

-- ============================================
-- 表结构注释
-- ============================================
COMMENT ON TABLE ai_personas IS 'AI 人设表 - 存储用户创建的聊天人设配置';
COMMENT ON TABLE ai_user_memories IS '用户长期记忆表 - 存储用户记忆信息，用于对话时召回';
COMMENT ON TABLE ai_chat_configs IS 'AI Chat 配置表 - 存储服务各类配置项';

-- ============================================
-- ai_personas 列注释
-- ============================================
COMMENT ON COLUMN ai_personas.id IS '人设唯一标识符';
COMMENT ON COLUMN ai_personas.user_id IS '所属用户ID';
COMMENT ON COLUMN ai_personas.name IS '人设名称';
COMMENT ON COLUMN ai_personas.description IS '人设描述/简介';
COMMENT ON COLUMN ai_personas.avatar_url IS '人设头像URL';
COMMENT ON COLUMN ai_personas.talk_style IS 'AI说话风格描述';
COMMENT ON COLUMN ai_personas.system_prompt IS '系统提示词，定义人设核心性格和行为';
COMMENT ON COLUMN ai_personas.is_default IS '是否为用户的默认人设';
COMMENT ON COLUMN ai_personas.created_at IS '记录创建时间（毫秒时间戳）';
COMMENT ON COLUMN ai_personas.updated_at IS '记录更新时间（毫秒时间戳）';

-- ============================================
-- ai_user_memories 列注释
-- ============================================
COMMENT ON COLUMN ai_user_memories.id IS '记忆记录唯一ID';
COMMENT ON COLUMN ai_user_memories.user_id IS '所属用户ID';
COMMENT ON COLUMN ai_user_memories.content IS '记忆内容文本';
COMMENT ON COLUMN ai_user_memories.keywords IS '关键词数组，用于记忆检索';
COMMENT ON COLUMN ai_user_memories.weight IS '记忆权重(0-100)，影响召回优先级';
COMMENT ON COLUMN ai_user_memories.is_core IS '是否为核心记忆，核心记忆优先召回';
COMMENT ON COLUMN ai_user_memories.created_at IS '记忆创建时间';
COMMENT ON COLUMN ai_user_memories.updated_at IS '记忆更新时间';

-- ============================================
-- ai_chat_configs 列注释
-- ============================================
COMMENT ON COLUMN ai_chat_configs.id IS '配置项唯一ID';
COMMENT ON COLUMN ai_chat_configs.config_key IS '配置键名称';
COMMENT ON COLUMN ai_chat_configs.config_value IS '配置值';
COMMENT ON COLUMN ai_chat_configs.config_type IS '配置类型：string/number/boolean/json';
COMMENT ON COLUMN ai_chat_configs.category IS '配置分类：redis/llm/dialog/token/circuit/summary';
COMMENT ON COLUMN ai_chat_configs.description IS '配置项的中文描述';
COMMENT ON COLUMN ai_chat_configs.is_encrypted IS '是否加密存储，加密字段不会返回明文';
COMMENT ON COLUMN ai_chat_configs.updated_at IS '配置更新时间';
COMMENT ON COLUMN ai_chat_configs.created_at IS '配置创建时间';