-- 灵越智报 v2.0 补充表结构
-- PostgreSQL 15+
-- 根据产品设计方案补充的表结构
-- 注意: ID 使用 VARCHAR(36) 以兼容 MyBatis-Plus 的 ASSIGN_UUID 策略
-- 注意: graph_nodes 和 graph_relations 表已在 graph_tables.sql 中定义，此处不再重复

-- ============================================
-- 1. 规则表（rules）
-- ============================================
CREATE TABLE IF NOT EXISTS rules (
    id VARCHAR(36) PRIMARY KEY,
    user_id VARCHAR(36) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
    name VARCHAR(255) NOT NULL,
    description TEXT,
    entry_node_id VARCHAR(36) REFERENCES graph_nodes(id) ON DELETE SET NULL,
    exit_node_id VARCHAR(36) REFERENCES graph_nodes(id) ON DELETE SET NULL,
    rule_chain JSONB NOT NULL DEFAULT '[]', -- 规则链（节点ID序列）
    status VARCHAR(20) DEFAULT 'active', -- active/inactive
    metadata JSONB DEFAULT '{}',
    create_by VARCHAR(36),
    create_by_name VARCHAR(100),
    create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    update_by VARCHAR(36),
    update_by_name VARCHAR(100),
    update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX IF NOT EXISTS idx_rules_user_id ON rules(user_id);
CREATE INDEX IF NOT EXISTS idx_rules_entry_node ON rules(entry_node_id);
CREATE INDEX IF NOT EXISTS idx_rules_exit_node ON rules(exit_node_id);
CREATE INDEX IF NOT EXISTS idx_rules_status ON rules(status);

-- ============================================
-- 4. 数据源表（data_sources）
-- ============================================
CREATE TABLE IF NOT EXISTS data_sources (
    id VARCHAR(36) PRIMARY KEY,
    user_id VARCHAR(36) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
    document_id VARCHAR(36) REFERENCES documents(id) ON DELETE SET NULL,
    name VARCHAR(255) NOT NULL,
    type VARCHAR(50) NOT NULL, -- table/text/image
    source_type VARCHAR(50) NOT NULL DEFAULT 'manual', -- file/manual/rule_result
    node_ids JSONB DEFAULT '{"refs": []}', -- 节点引用列表（支持 graph_node 和 document_element）
    config JSONB DEFAULT '{}', -- 数据源配置
    metadata JSONB DEFAULT '{}',
    value_type VARCHAR(20) DEFAULT 'text', -- 值类型: text/image/table/mixed
    aggregate_type VARCHAR(20) DEFAULT 'first', -- 聚合方式: first/last/concat/sum/avg/list
    separator VARCHAR(50) DEFAULT '', -- 聚合分隔符（concat时使用）
    create_by VARCHAR(36),
    create_by_name VARCHAR(100),
    create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    update_by VARCHAR(36),
    update_by_name VARCHAR(100),
    update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX IF NOT EXISTS idx_data_sources_user_id ON data_sources(user_id);
CREATE INDEX IF NOT EXISTS idx_data_sources_document_id ON data_sources(document_id);
CREATE INDEX IF NOT EXISTS idx_data_sources_type ON data_sources(type);

-- ============================================
-- 5. 模板表（templates）
-- ============================================
-- 注意: templates 表已迁移至 template_tables.sql（v2.0 版本）
-- 新版包含: templates, source_files, variables, generations
-- 请勿在此重复定义

-- ============================================
-- 6. 文本存储路径表（text_storage）
-- ============================================
CREATE TABLE IF NOT EXISTS text_storage (
    id VARCHAR(36) PRIMARY KEY,
    document_id VARCHAR(36) NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
    file_path VARCHAR(500) NOT NULL, -- TXT文件路径
    file_size BIGINT,
    checksum VARCHAR(64), -- 文件校验和
    create_by VARCHAR(36),
    create_by_name VARCHAR(100),
    create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    update_by VARCHAR(36),
    update_by_name VARCHAR(100),
    update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX IF NOT EXISTS idx_text_storage_document_id ON text_storage(document_id);
CREATE UNIQUE INDEX IF NOT EXISTS idx_text_storage_document_unique ON text_storage(document_id);

-- ============================================
-- 注意: vector_embeddings 表已在 rag_tables_compatible.sql 中定义
-- 请勿在此重复定义，以避免表结构冲突
-- ============================================

-- ============================================
-- 创建更新时间触发器
-- ============================================
-- 注意: graph_nodes 和 graph_relations 的触发器已在 graph_tables.sql 中定义
-- 注意: vector_embeddings 的触发器已在 rag_tables_compatible.sql 中定义

DROP TRIGGER IF EXISTS update_rules_update_time ON rules;
CREATE TRIGGER update_rules_update_time BEFORE UPDATE ON rules
    FOR EACH ROW EXECUTE FUNCTION update_update_time_column();

DROP TRIGGER IF EXISTS update_data_sources_update_time ON data_sources;
CREATE TRIGGER update_data_sources_update_time BEFORE UPDATE ON data_sources
    FOR EACH ROW EXECUTE FUNCTION update_update_time_column();

-- templates 触发器已迁移至 template_tables.sql

DROP TRIGGER IF EXISTS update_text_storage_update_time ON text_storage;
CREATE TRIGGER update_text_storage_update_time BEFORE UPDATE ON text_storage
    FOR EACH ROW EXECUTE FUNCTION update_update_time_column();
