-- =============================
-- 知识库管理模块
-- 支持：招投标知识库、客服知识库、企业内部知识库
-- =============================
CREATE SCHEMA IF NOT EXISTS knowledge;

-- 知识库表（多租户知识库定义）
DROP TABLE IF EXISTS knowledge.tb_knowledge_base CASCADE;
CREATE TABLE knowledge.tb_knowledge_base (
  optsn           VARCHAR(50)   NOT NULL,               -- 流水号
  agent_id        VARCHAR(50)   NOT NULL,               -- 智能体id
  knowledge_id           VARCHAR(50)   NOT NULL,               -- 知识库ID
  name            VARCHAR(255)  NOT NULL,               -- 知识库名称
  kb_type         VARCHAR(50)   NOT NULL,               -- 知识库类型：bidding-招投标/customer_service-客服/internal-内部协同
  access_level    VARCHAR(20)   NOT NULL DEFAULT 'private', -- 访问级别：public-公开/private-私有/internal-内部
  description     TEXT,                                 -- 知识库描述
  storage_path    VARCHAR(500),                         -- 存储路径
  version         VARCHAR(20)   DEFAULT '1.0',          -- 当前版本号
  config          JSONB         DEFAULT NULL,           -- 知识库配置（JSON格式：索引配置、检索参数等）
  service_type    VARCHAR(50),                          -- 服务类型（bidding/customer_service/internal，冗余kb_type便于查询）
  dept_path       VARCHAR(255)  DEFAULT NULL,           -- 部门全路径
  status          VARCHAR(20)   NOT NULL DEFAULT 'active', -- 状态：active-激活/inactive-停用/archived-归档
  creator         VARCHAR(50)   DEFAULT NULL,           -- 创建者
  updater         VARCHAR(50)   DEFAULT NULL,           -- 更新者
  create_time     TIMESTAMPTZ   NOT NULL DEFAULT now(), -- 创建时间
  update_time     TIMESTAMPTZ   DEFAULT NULL,           -- 更新时间
  delete_time     TIMESTAMPTZ   DEFAULT NULL,           -- 删除时间
  deleted         BOOLEAN       NOT NULL DEFAULT false, -- 是否删除
  PRIMARY KEY (knowledge_id),
  UNIQUE (optsn)
);

CREATE INDEX idx_kb_type ON knowledge.tb_knowledge_base(kb_type) WHERE deleted = false;
CREATE INDEX idx_kb_service ON knowledge.tb_knowledge_base(service_type) WHERE deleted = false;
CREATE INDEX idx_kb_dept_path ON knowledge.tb_knowledge_base(dept_path) WHERE deleted = false;

COMMENT ON TABLE knowledge.tb_knowledge_base IS '知识库表';
COMMENT ON COLUMN knowledge.tb_knowledge_base.kb_type IS '知识库类型：bidding-招投标/customer_service-客服/internal-内部协同';
COMMENT ON COLUMN knowledge.tb_knowledge_base.service_type IS '服务类型（冗余存储便于快速过滤，与kb_type保持一致）';
COMMENT ON COLUMN knowledge.tb_knowledge_base.access_level IS '访问级别：public-公开/private-私有/internal-内部';

-- 知识文档表
DROP TABLE IF EXISTS knowledge.tb_knowledge_document CASCADE;
CREATE TABLE knowledge.tb_knowledge_document (
  optsn           VARCHAR(50)   NOT NULL,               -- 流水号
  doc_id          VARCHAR(50)   NOT NULL,               -- 文档ID
  knowledge_id           VARCHAR(50)   NOT NULL,               -- 所属知识库ID
  title           VARCHAR(500)  NOT NULL,               -- 文档标题
  doc_type        VARCHAR(50)   NOT NULL,               -- 文档类型：text-文本/pdf/word/excel/image/video
  category        VARCHAR(100),                         -- 文档分类（自动或手动分类）
  content         TEXT,                                 -- 文档内容（文本类型）
  content_summary TEXT,                                 -- 内容摘要（AI生成）
  file_id         VARCHAR(50),                          -- 关联文件表ID
  file_path       VARCHAR(500),                         -- 文件路径
  file_size       BIGINT,                               -- 文件大小（字节）
  mime_type       VARCHAR(100),                         -- MIME类型
  version         INTEGER       DEFAULT 1,              -- 文档版本号（仅做记录）
  root_doc_id     VARCHAR(50),                          -- 根文档ID（版本组标识，保留用于整体版本管理）
  tags            TEXT[],                               -- 文档标签数组
  keywords        TEXT[],                               -- 关键词数组（AI提取）
  embedding_status VARCHAR(20)  DEFAULT 'pending',      -- 向量化状态：pending-待处理/processing-处理中/completed-完成/failed-失败
  embedding_model VARCHAR(100),                         -- 使用的向量化模型
  chunk_count     INTEGER       DEFAULT 0,              -- 切片数量
  metadata        JSONB         DEFAULT NULL,           -- 文档元数据（JSON格式）
  source_url      VARCHAR(500),                         -- 来源URL
  service_type    VARCHAR(50),                          -- 服务类型（继承自知识库）
  dept_path       VARCHAR(255)  DEFAULT NULL,           -- 部门全路径
  status          VARCHAR(20)   NOT NULL DEFAULT 'active', -- 状态：active-激活/inactive-停用/archived-归档
  creator         VARCHAR(50)   DEFAULT NULL,           -- 创建者
  updater         VARCHAR(50)   DEFAULT NULL,           -- 更新者
  create_time     TIMESTAMPTZ   NOT NULL DEFAULT now(), -- 创建时间
  update_time     TIMESTAMPTZ   DEFAULT NULL,           -- 更新时间
  delete_time     TIMESTAMPTZ   DEFAULT NULL,           -- 删除时间
  deleted         BOOLEAN       NOT NULL DEFAULT false, -- 是否删除
  PRIMARY KEY (doc_id),
  UNIQUE (optsn)
);

CREATE INDEX idx_doc_kb ON knowledge.tb_knowledge_document(knowledge_id) WHERE deleted = false;
CREATE INDEX idx_doc_service ON knowledge.tb_knowledge_document(service_type) WHERE deleted = false;
CREATE INDEX idx_doc_category ON knowledge.tb_knowledge_document(category) WHERE deleted = false;
CREATE INDEX idx_doc_embedding_status ON knowledge.tb_knowledge_document(embedding_status) WHERE deleted = false;
CREATE INDEX idx_doc_tags ON knowledge.tb_knowledge_document USING GIN(tags) WHERE deleted = false;
CREATE INDEX idx_doc_root ON knowledge.tb_knowledge_document(root_doc_id) WHERE deleted = false;

COMMENT ON TABLE knowledge.tb_knowledge_document IS '知识文档表（文档级元数据，版本控制在chunk级别）';
COMMENT ON COLUMN knowledge.tb_knowledge_document.service_type IS '服务类型（从知识库继承，用于服务间隔离）';
COMMENT ON COLUMN knowledge.tb_knowledge_document.version IS '文档版本号（仅做记录，实际版本控制在chunk级别）';
COMMENT ON COLUMN knowledge.tb_knowledge_document.root_doc_id IS '根文档ID（用于文档整体版本管理，可选）';
COMMENT ON COLUMN knowledge.tb_knowledge_document.embedding_status IS '向量化状态：pending/processing/completed/failed';

-- 知识文档片段表（用于RAG检索）
DROP TABLE IF EXISTS knowledge.tb_knowledge_chunk CASCADE;
CREATE TABLE knowledge.tb_knowledge_chunk (
  optsn           VARCHAR(50)   NOT NULL,               -- 流水号
  chunk_id        VARCHAR(50)   NOT NULL,               -- 片段ID
  doc_id          VARCHAR(50)   NOT NULL,               -- 所属文档ID
  knowledge_id           VARCHAR(50)   NOT NULL,               -- 所属知识库ID
  chunk_index     INTEGER       NOT NULL,               -- 片段索引（在文档中的顺序）
  content         TEXT          NOT NULL,               -- 片段内容
  content_length  INTEGER,                              -- 内容长度
  embedding       vector(1536),                         -- 向量嵌入（假设使用OpenAI 1536维）
  chunk_type      VARCHAR(20)   DEFAULT 'text',         -- 片段类型：text-文本/table-表格/image-图片
  version         INTEGER       DEFAULT 1,              -- chunk版本号（每次修改自动+1）
  root_chunk_id   VARCHAR(50),                          -- 根chunk ID（同一chunk的不同版本共享此ID）
  is_current      BOOLEAN       DEFAULT true,           -- 是否当前使用的版本
  position_info   JSONB,                                -- 位置信息（页码、坐标等）
  metadata        JSONB,                                -- 片段元数据
  dept_path       VARCHAR(255)  DEFAULT NULL,           -- 部门全路径
  creator         VARCHAR(50)   DEFAULT NULL,           -- 创建者
  create_time     TIMESTAMPTZ   NOT NULL DEFAULT now(), -- 创建时间
  update_time     TIMESTAMPTZ   DEFAULT NULL,           -- 更新时间
  deleted         BOOLEAN       NOT NULL DEFAULT false, -- 是否删除
  PRIMARY KEY (chunk_id),
  UNIQUE (optsn)
);

CREATE INDEX idx_chunk_doc ON knowledge.tb_knowledge_chunk(doc_id) WHERE deleted = false;
CREATE INDEX idx_chunk_kb ON knowledge.tb_knowledge_chunk(knowledge_id) WHERE deleted = false;
CREATE INDEX idx_chunk_root_current ON knowledge.tb_knowledge_chunk(root_chunk_id, is_current) WHERE deleted = false;
CREATE INDEX idx_chunk_current ON knowledge.tb_knowledge_chunk(is_current) WHERE deleted = false AND is_current = true;
-- 向量检索索引（需要安装pgvector扩展，建议只索引当前版本）
-- CREATE INDEX idx_chunk_embedding ON knowledge.tb_knowledge_chunk USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100) WHERE deleted = false AND is_current = true;

COMMENT ON TABLE knowledge.tb_knowledge_chunk IS '知识文档片段表（RAG检索基本单位，支持chunk级版本控制）';
COMMENT ON COLUMN knowledge.tb_knowledge_chunk.version IS 'chunk版本号（整数，每次修改自动+1）';
COMMENT ON COLUMN knowledge.tb_knowledge_chunk.root_chunk_id IS '根chunk ID（同一chunk的所有版本共享此ID，首次创建时等于chunk_id）';
COMMENT ON COLUMN knowledge.tb_knowledge_chunk.is_current IS '是否当前使用的版本（每个root_chunk_id只有一个is_current=true，RAG检索时只使用当前版本）';
COMMENT ON COLUMN knowledge.tb_knowledge_chunk.embedding IS '向量嵌入（需要pgvector扩展，建议只为is_current=true的chunk生成）';

-- 知识访问日志表
DROP TABLE IF EXISTS knowledge.tb_knowledge_access_log CASCADE;
CREATE TABLE knowledge.tb_knowledge_access_log (
  optsn           VARCHAR(50)   NOT NULL,               -- 流水号
  log_id          VARCHAR(50)   NOT NULL,               -- 日志ID
  knowledge_id           VARCHAR(50),                          -- 知识库ID
  doc_id          VARCHAR(50),                          -- 文档ID
  user_id         VARCHAR(50)   NOT NULL,               -- 用户ID
  access_type     VARCHAR(20)   NOT NULL,               -- 访问类型：view-查看/download-下载/search-搜索/edit-编辑
  query_text      TEXT,                                 -- 搜索查询文本
  result_count    INTEGER,                              -- 搜索结果数量
  ip_address      VARCHAR(45),                          -- IP地址
  user_agent      TEXT,                                 -- 用户代理
  dept_path       VARCHAR(255)  DEFAULT NULL,           -- 部门全路径
  create_time     TIMESTAMPTZ   NOT NULL DEFAULT now(), -- 创建时间
  PRIMARY KEY (log_id),
  UNIQUE (optsn)
);

CREATE INDEX idx_access_log_user ON knowledge.tb_knowledge_access_log(user_id, create_time DESC);
CREATE INDEX idx_access_log_kb ON knowledge.tb_knowledge_access_log(knowledge_id, create_time DESC);

COMMENT ON TABLE knowledge.tb_knowledge_access_log IS '知识访问日志表';
