import { PrismaClient } from '@prisma/client';
import { grantRoleAccess, upsertPage } from '../scripts/lib/page-helpers';

/**
 * Bootstrap seed — 全模块共享的最小公共集
 *
 * 任何模块 seed 都假设以下 3 个对象已存在：
 *   1. SYSTEM_ADMIN 角色   —— 各模块 grant SYSTEM_ADMIN 时通过 name 查找
 *   2. admin 顶级 page     —— 各业务模块 page 的 parentId
 *   3. dataMngt 分组 page  —— 自动生成 CRUD 页面（data-mngt.seed.ts）的 parentId
 *
 * 同时把 SYSTEM_ADMIN 对 admin / dataMngt 这两个分组节点的 RolePages 也建好，
 * 否则它们的子菜单父节点不会展开。
 *
 * 必须在所有模块 seed 之前运行（由 seed/index.ts 编排）。
 * 幂等：upsert / skipDuplicates。
 */
export async function seedBootstrap(prisma: PrismaClient): Promise<void> {
  // ── SYSTEM_ADMIN 角色 ──────────────────────────────────────────────────────
  const systemAdminRole = await prisma.role.upsert({
    where: { name: 'SYSTEM_ADMIN' },
    update: {},
    create: {
      name: 'SYSTEM_ADMIN',
      description: 'System administrator with full access',
    },
  });
  console.log(`[bootstrap] Role: SYSTEM_ADMIN (id=${systemAdminRole.id})`);

  // ── admin 顶级分组 page ────────────────────────────────────────────────────
  const adminPage = await upsertPage(prisma, {
    code: 'admin',
    name: 'admin',
    zhName: '系统管理',
    enName: 'System Mgnt',
    sortOrder: 1000,
  });
  console.log(`[bootstrap] Page: ${adminPage.code} (id=${adminPage.id})`);

  // ── dataMngt 分组 page（自动 CRUD 菜单容器） ──────────────────────────────
  const dataMngtPage = await upsertPage(prisma, {
    code: 'dataMngt',
    name: '数据管理',
    zhName: '数据管理',
    enName: 'Data Management',
    sortOrder: 1000,
    parentId: adminPage.id,
  });
  console.log(`[bootstrap] Page: ${dataMngtPage.code} (id=${dataMngtPage.id})`);

  // ── 分组 page 的 SYSTEM_ADMIN RolePages（无 resource） ──────────────────────
  // 分组节点本身不绑定 resource，只为让侧边栏父节点对 SYSTEM_ADMIN 可见
  await grantRoleAccess(prisma, systemAdminRole.id, adminPage.id, []);
  await grantRoleAccess(prisma, systemAdminRole.id, dataMngtPage.id, []);
  console.log(`[bootstrap] RolePages: SYSTEM_ADMIN → admin, dataMngt`);
}
