-- 知识库主表
CREATE TABLE IF NOT EXISTS public.knowledge_base (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  title text NOT NULL,
  content text NOT NULL,
  source_type text NOT NULL DEFAULT 'manual', -- docs | mem | manual | system_guide
  source_path text, -- e.g. 'docs/project-overview.md'
  category text, -- architecture | feature | api | onboarding | troubleshooting
  tags text[] DEFAULT ARRAY[]::text[],
  embedding vector(1536), -- OpenAI text-embedding-3-small
  is_active boolean NOT NULL DEFAULT true,
  metadata jsonb DEFAULT '{}'::jsonb,
  created_at timestamptz NOT NULL DEFAULT now(),
  updated_at timestamptz NOT NULL DEFAULT now()
);

-- 索引
CREATE INDEX IF NOT EXISTS idx_kb_source_type ON public.knowledge_base(source_type);
CREATE INDEX IF NOT EXISTS idx_kb_category ON public.knowledge_base(category);
CREATE INDEX IF NOT EXISTS idx_kb_active ON public.knowledge_base(is_active);
CREATE INDEX IF NOT EXISTS idx_kb_tags ON public.knowledge_base USING gin(tags);
CREATE INDEX IF NOT EXISTS idx_kb_embedding ON public.knowledge_base USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);

-- updated_at 触发器
CREATE TRIGGER set_kb_updated_at
  BEFORE UPDATE ON public.knowledge_base
  FOR EACH ROW
  EXECUTE FUNCTION public.set_updated_at();

-- RLS
ALTER TABLE public.knowledge_base ENABLE ROW LEVEL SECURITY;

CREATE POLICY "Anyone authenticated can read active knowledge"
  ON public.knowledge_base FOR SELECT
  TO authenticated
  USING (is_active = true);

CREATE POLICY "Admins can manage knowledge base"
  ON public.knowledge_base FOR ALL
  TO authenticated
  USING (public.has_role(auth.uid(), 'admin'::app_role) OR public.has_role(auth.uid(), 'super_admin'::app_role))
  WITH CHECK (public.has_role(auth.uid(), 'admin'::app_role) OR public.has_role(auth.uid(), 'super_admin'::app_role));

-- 检索函数：基于向量相似度
CREATE OR REPLACE FUNCTION public.search_knowledge_base(
  query_embedding vector(1536),
  match_count int DEFAULT 5,
  filter_category text DEFAULT NULL,
  min_similarity float DEFAULT 0.5
)
RETURNS TABLE (
  id uuid,
  title text,
  content text,
  source_type text,
  source_path text,
  category text,
  tags text[],
  similarity float
)
LANGUAGE sql
STABLE
SECURITY DEFINER
SET search_path = public
AS $$
  SELECT
    kb.id,
    kb.title,
    kb.content,
    kb.source_type,
    kb.source_path,
    kb.category,
    kb.tags,
    1 - (kb.embedding <=> query_embedding) AS similarity
  FROM public.knowledge_base kb
  WHERE kb.is_active = true
    AND kb.embedding IS NOT NULL
    AND (filter_category IS NULL OR kb.category = filter_category)
    AND 1 - (kb.embedding <=> query_embedding) >= min_similarity
  ORDER BY kb.embedding <=> query_embedding
  LIMIT match_count;
$$;

-- 种子数据：写入项目档案核心条目
INSERT INTO public.knowledge_base (title, content, source_type, source_path, category, tags) VALUES
('项目档案 · 总览', '智能电商管理系统由 C 端消费者侧和 B 端管理后台组成。C 端通过"小智"对话推荐手机；B 端由 5 个 Agent（小管/小品/小营/小财/小服）通过自然语言执行运营。技术栈：React 18 + Vite 5 + Supabase + Dify/Coze。核心理念：业务由 AI 主导执行，人类负责审批和兜底。', 'docs', 'docs/project-overview.md', 'architecture', ARRAY['总览','架构','agent']),
('五大业务 Agent', '小管（商城经理）：全局监控+目标设定；小品（商品经理）：商品/库存/SKU；小营（营销经理）：优惠券/秒杀/拼团/支付有礼；小财（财务经理）：订单收款/充值/对账；小服（客服经理）：售后/退换/投诉。协作模式：小管设目标→各Agent自动执行→高风险走审批。', 'docs', 'docs/project-overview.md', 'architecture', ARRAY['agent','协作']),
('数据库 SSOT 原则', '数据库是唯一真相源（Single Source of Truth）。AI 严禁编造 UUID，找不到匹配商品就返回空数组 picks:[]。所有 product_id 必须来自 products 表的真实记录。', 'mem', 'mem://architecture/coze-database-ssot-principle', 'architecture', ARRAY['约束','ssot','幻觉']),
('Office 命名法', 'UI 文案必须使用办公室/部门术语，例如"经理办公室"、"财务室"、"营销部"。严禁使用"驾驶舱"、"Dashboard"、"Cockpit"等技术术语。', 'mem', 'mem://ui/office-based-terminology', 'feature', ARRAY['ui','文案','约束']),
('管理端 Action 执行顺序', '管理端 AI 命令同时返回 DATA_ACTION 和 PAGE_ACTION 时，必须先执行 DATA_ACTION（写库），完成后再执行 PAGE_ACTION（跳转/筛选）。否则会跳到没数据的空页面。', 'mem', 'mem://architecture/unified-admin-actions-system', 'architecture', ARRAY['admin','action','顺序']),
('双引擎聊天策略', 'C 端消费者聊天主用 Dify，失败自动降级到 Coze；B 端管理后台主用 Coze Workflow。两侧均使用 SSE 流式协议。', 'mem', 'mem://architecture/dual-engine-chat-strategy', 'architecture', ARRAY['ai','chat','dify','coze']),
('Root 管理员', '根管理员手机号：17316420589。在数据库中分配 super_admin 角色。任何运维操作或权限初始化都以此账号为准。', 'mem', 'mem://auth/root-administrator-identity', 'feature', ARRAY['auth','admin','权限']),
('GenUI 渲染契约', 'AI 输出 UI Schema 格式：{layout, gap, components:[{type, props}]}。type 必须是注册的组件之一（stats_row/data_table/chart/alert/insight_card/progress_bar/text/container/insight_feed/approval_list）。所有属性必须在 props 内部。DynamicRenderer 会自动 normalize。', 'docs', 'docs/genui-api-guide.md', 'api', ARRAY['genui','schema','契约']),
('知识库三件套', '项目知识同时维护在三处：mem://（自动应用规则）、docs/（详细文档）、knowledge_base 表（pgvector RAG）。重大架构变更需同步三处。', 'manual', null, 'onboarding', ARRAY['知识库','维护','流程']);
