-- 1. 创建 agent_user 表
CREATE TABLE IF NOT EXISTS agent_user (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    username VARCHAR(255) UNIQUE NOT NULL,
    email VARCHAR(255) UNIQUE,
    password_hash VARCHAR(255) NOT NULL,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    last_login TIMESTAMP WITH TIME ZONE,
    is_active BOOLEAN DEFAULT TRUE,
    is_admin BOOLEAN DEFAULT FALSE,
    is_subaccount BOOLEAN DEFAULT FALSE,          -- 是否是子账号
    parent_id UUID REFERENCES agent_user(id) ON DELETE CASCADE,  -- 主账号ID
    CONSTRAINT check_not_self_parent CHECK (parent_id IS NULL OR parent_id != id)
);

-- agent_user 索引
CREATE INDEX IF NOT EXISTS idx_agent_user_username ON agent_user(username);
CREATE INDEX IF NOT EXISTS idx_agent_user_email ON agent_user(email);
CREATE INDEX IF NOT EXISTS idx_agent_user_is_active ON agent_user(is_active);
CREATE INDEX IF NOT EXISTS idx_agent_user_parent_id ON agent_user(parent_id);
CREATE INDEX IF NOT EXISTS idx_agent_user_is_subaccount ON agent_user(is_subaccount);

-- 2. 创建 agent_bots 表
CREATE TABLE IF NOT EXISTS agent_bots (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    name VARCHAR(255) NOT NULL,
    settings JSONB DEFAULT '{"language": "zh", "enable_memori": false, "enable_thinking": false, "tool_response": false}'::jsonb,
    owner_id UUID NOT NULL REFERENCES agent_user(id) ON DELETE RESTRICT,
    is_published BOOLEAN DEFAULT FALSE,                          -- 是否发布到智能体广场
    copied_from UUID REFERENCES agent_bots(id) ON DELETE SET NULL, -- 复制来源的bot id
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- agent_bots 索引
CREATE INDEX IF NOT EXISTS idx_agent_bots_owner_id ON agent_bots(owner_id);
CREATE INDEX IF NOT EXISTS idx_agent_bots_is_published ON agent_bots(is_published) WHERE is_published = TRUE;
CREATE INDEX IF NOT EXISTS idx_agent_bots_copied_from ON agent_bots(copied_from);

-- 3. 创建 agent_user_tokens 表
CREATE TABLE IF NOT EXISTS agent_user_tokens (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    user_id UUID NOT NULL REFERENCES agent_user(id) ON DELETE CASCADE,
    token VARCHAR(255) NOT NULL UNIQUE,
    expires_at TIMESTAMP WITH TIME ZONE NOT NULL,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- agent_user_tokens 索引
CREATE INDEX IF NOT EXISTS idx_agent_user_tokens_token ON agent_user_tokens(token);
CREATE INDEX IF NOT EXISTS idx_agent_user_tokens_user_id ON agent_user_tokens(user_id);
CREATE INDEX IF NOT EXISTS idx_agent_user_tokens_expires ON agent_user_tokens(expires_at);

-- 4. 创建 agent_admin_tokens 表
CREATE TABLE IF NOT EXISTS agent_admin_tokens (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    username VARCHAR(255) NOT NULL,
    token VARCHAR(255) NOT NULL UNIQUE,
    expires_at TIMESTAMP WITH TIME ZONE NOT NULL,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- agent_admin_tokens 索引
CREATE INDEX IF NOT EXISTS idx_agent_admin_tokens_token ON agent_admin_tokens(token);
CREATE INDEX IF NOT EXISTS idx_agent_admin_tokens_expires ON agent_admin_tokens(expires_at);

-- 6. 创建 agent_mcp_servers 表 (agent_models 表已废弃，模型管理已迁移到 New API)
CREATE TABLE IF NOT EXISTS agent_mcp_servers (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    bot_id UUID REFERENCES agent_bots(id) ON DELETE CASCADE,
    name VARCHAR(255) NOT NULL,
    type VARCHAR(50) NOT NULL,
    config JSONB NOT NULL,
    enabled BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- agent_mcp_servers 索引
CREATE INDEX IF NOT EXISTS idx_agent_mcp_servers_bot_id ON agent_mcp_servers(bot_id);
CREATE INDEX IF NOT EXISTS idx_agent_mcp_servers_enabled ON agent_mcp_servers(enabled);

-- 7. 创建 agent_chat_sessions 表
CREATE TABLE IF NOT EXISTS agent_chat_sessions (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    bot_id UUID REFERENCES agent_bots(id) ON DELETE CASCADE,
    title VARCHAR(500),
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- agent_chat_sessions 索引
CREATE INDEX IF NOT EXISTS idx_agent_chat_sessions_bot_id ON agent_chat_sessions(bot_id);
CREATE INDEX IF NOT EXISTS idx_agent_chat_sessions_created ON agent_chat_sessions(created_at DESC);

-- 8. 创建 bot_shares 表
CREATE TABLE IF NOT EXISTS bot_shares (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    bot_id UUID NOT NULL REFERENCES agent_bots(id) ON DELETE CASCADE,
    user_id UUID NOT NULL REFERENCES agent_user(id) ON DELETE CASCADE,
    shared_by UUID NOT NULL REFERENCES agent_user(id) ON DELETE SET NULL,
    role VARCHAR(50) DEFAULT 'viewer' CHECK (role IN ('viewer', 'editor')),
    shared_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    expires_at TIMESTAMP WITH TIME ZONE,
    UNIQUE(bot_id, user_id)
);

-- bot_shares 索引
CREATE INDEX IF NOT EXISTS idx_bot_shares_bot_id ON bot_shares(bot_id);
CREATE INDEX IF NOT EXISTS idx_bot_shares_user_id ON bot_shares(user_id);
CREATE INDEX IF NOT EXISTS idx_bot_shares_shared_by ON bot_shares(shared_by);

-- 9. 创建 user_datasets 表（用户与 RAGFlow 数据集的关联表）
CREATE TABLE IF NOT EXISTS user_datasets (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    user_id UUID NOT NULL REFERENCES agent_user(id) ON DELETE CASCADE,
    dataset_id VARCHAR(255) NOT NULL,              -- RAGFlow 返回的 dataset_id
    dataset_name VARCHAR(255),                      -- 冗余存储数据集名称，方便查询
    owner BOOLEAN DEFAULT TRUE,                     -- 是否为所有者（预留分享功能）
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    UNIQUE(user_id, dataset_id)
);

-- user_datasets 索引
CREATE INDEX IF NOT EXISTS idx_user_datasets_user_id ON user_datasets(user_id);
CREATE INDEX IF NOT EXISTS idx_user_datasets_dataset_id ON user_datasets(dataset_id);

-- ===========================
-- 默认 Admin 账号
-- 用户名: admin
-- 密码: admin123
-- ===========================
INSERT INTO agent_user (id, username, email, password_hash, is_active, is_admin)
VALUES (
    '00000000-0000-0000-0000-000000000001',
    'admin',
    'admin@local',
    '240be518fabd2724ddb6f04eeb1da5967448d7e831c08c8fa822809f74c720a9',
    TRUE,
    TRUE
) ON CONFLICT (username) DO NOTHING;
