-- =====================================================================================
-- Schema: 权限管理 (RBAC) 核心表
-- 位置：docs/sql/10_schema/user/ak_auth_system_v1.sql
-- 对象类型：TABLE
-- 版本：v1
-- 说明：包含角色表、权限/菜单表及用户角色关联表
-- =====================================================================================

-- 1. 角色表
CREATE TABLE IF NOT EXISTS public.ak_roles (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    name TEXT NOT NULL UNIQUE,      -- 角色名称 (如: 超级管理员)
    code TEXT NOT NULL UNIQUE,      -- 角色编码 (如: super_admin)
    description TEXT,               -- 角色描述
    is_active BOOLEAN NOT NULL DEFAULT TRUE,
    created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
    updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

-- 2. 权限/菜单表
CREATE TABLE IF NOT EXISTS public.ak_permissions (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    parent_id UUID REFERENCES public.ak_permissions(id) ON DELETE CASCADE,
    
    name TEXT NOT NULL,             -- 权限/菜单名称
    code TEXT NOT NULL UNIQUE,      -- 权限编码 (如: order_view)
    type TEXT NOT NULL,             -- 类型: menu(菜单), button(按钮/接口)
    
    path TEXT,                      -- 前端路由路径 (仅针对 menu)
    icon TEXT,                      -- 图标
    sort_order INTEGER DEFAULT 0,   -- 排序
    
    is_visible BOOLEAN DEFAULT TRUE, -- 菜单是否在左侧可见
    created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
    updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

-- 3. 用户-角色关联表
-- 映射管理员 (ak_users) 与角色
CREATE TABLE IF NOT EXISTS public.ak_admin_roles (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    user_id UUID NOT NULL REFERENCES public.ak_users(id) ON DELETE CASCADE,
    role_id UUID NOT NULL REFERENCES public.ak_roles(id) ON DELETE CASCADE,
    
    assigned_at TIMESTAMPTZ NOT NULL DEFAULT now(),
    assigned_by UUID REFERENCES public.ak_users(id),
    
    UNIQUE(user_id, role_id)
);

-- 4. 角色-权限关联表
CREATE TABLE IF NOT EXISTS public.ak_role_permissions (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    role_id UUID NOT NULL REFERENCES public.ak_roles(id) ON DELETE CASCADE,
    permission_id UUID NOT NULL REFERENCES public.ak_permissions(id) ON DELETE CASCADE,
    
    UNIQUE(role_id, permission_id)
);

-- 索引
CREATE INDEX IF NOT EXISTS idx_permissions_parent_id ON public.ak_permissions(parent_id);
CREATE INDEX IF NOT EXISTS idx_admin_roles_user_id ON public.ak_admin_roles(user_id);
CREATE INDEX IF NOT EXISTS idx_role_permissions_role_id ON public.ak_role_permissions(role_id);

-- 注释
COMMENT ON TABLE public.ak_roles IS '后台管理角色表';
COMMENT ON TABLE public.ak_permissions IS '功能权限与菜单定义表';
COMMENT ON TABLE public.ak_admin_roles IS '管理员角色分配表';
COMMENT ON TABLE public.ak_role_permissions IS '角色权限映射表';
