/**
 * Test Cleanup Utilities
 * 
 * 测试数据清理工具
 * 
 * 基于文档: docs/modules/organization/09-test-scenarios.md - 测试数据清理
 */

import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

/**
 * 清理所有测试数据（按依赖顺序）
 */
export async function cleanupAllTestData() {
  // 1. 清理关联表
  await prisma.userRole.deleteMany({});
  await prisma.rolePermission.deleteMany({});
  await prisma.userDepartment.deleteMany({});
  await prisma.organizationRegion.deleteMany({});

  // 2. 清理主表
  await prisma.user.deleteMany({});
  await prisma.department.deleteMany({});
  await prisma.role.deleteMany({});
  await prisma.permission.deleteMany({});
  await prisma.position.deleteMany({});
  await prisma.organization.deleteMany({});
  await prisma.region.deleteMany({});
}

/**
 * 清理组织相关数据
 */
export async function cleanupOrganizationData() {
  await prisma.userDepartment.deleteMany({});
  await prisma.organizationRegion.deleteMany({});
  await prisma.department.deleteMany({});
  await prisma.organization.deleteMany({});
}

/**
 * 清理用户相关数据
 */
export async function cleanupUserData() {
  await prisma.userRole.deleteMany({});
  await prisma.userDepartment.deleteMany({});
  await prisma.user.deleteMany({});
}

/**
 * 清理权限相关数据
 */
export async function cleanupPermissionData() {
  await prisma.userRole.deleteMany({});
  await prisma.rolePermission.deleteMany({});
  await prisma.role.deleteMany({});
  await prisma.permission.deleteMany({});
}

/**
 * 在每个测试前执行清理（推荐）
 */
export async function beforeEachTest() {
  await cleanupAllTestData();
}

/**
 * 在每个测试后执行清理（可选）
 */
export async function afterEachTest() {
  // 根据需要可以选择性清理
}

/**
 * 在所有测试完成后断开数据库连接
 */
export async function afterAllTests() {
  await prisma.$disconnect();
}

/**
 * 清理数据库（集成测试使用）
 * @param prismaInstance - Prisma 实例
 */
export async function cleanupDatabase(prismaInstance: PrismaClient) {
  // 1. 清理关联表
  await prismaInstance.userRole.deleteMany({});
  await prismaInstance.rolePermission.deleteMany({});
  await prismaInstance.userDepartment.deleteMany({});
  await prismaInstance.organizationRegion.deleteMany({});

  // 2. 清理主表
  await prismaInstance.user.deleteMany({});
  await prismaInstance.department.deleteMany({});
  await prismaInstance.role.deleteMany({});
  await prismaInstance.permission.deleteMany({});
  await prismaInstance.position.deleteMany({});
  await prismaInstance.organization.deleteMany({});
  await prismaInstance.region.deleteMany({});
  await prismaInstance.workflowRole.deleteMany({});
}

