/**
 * Department Factory - 测试数据工厂
 * 
 * 用于生成测试部门数据
 * 
 * 基于文档: docs/modules/organization/09-test-scenarios.md - 测试工具和辅助函数
 */

import { PrismaClient } from '@prisma/client';
import { randomString } from './user.factory';

const prisma = new PrismaClient();

/**
 * 创建测试部门
 */
export async function createTestDepartment(overrides: any = {}) {
  const defaultData = {
    code: `DEPT_${randomString()}`,
    name: `测试部门_${randomString()}`,
    status: 'ACTIVE',
  };

  return await prisma.department.create({
    data: {
      ...defaultData,
      ...overrides,
    },
    include: {
      organization: true,
      parent: true,
      children: true,
    },
  });
}

/**
 * 批量创建部门
 */
export async function createManyDepartments(
  count: number,
  organizationId: string,
  parentId: string | null = null,
) {
  const departments = [];
  for (let i = 0; i < count; i++) {
    const dept = await createTestDepartment({
      code: `DEPT_${i}_${randomString(4)}`,
      name: `部门${i}`,
      organizationId,
      parentId,
    });
    departments.push(dept);
  }
  return departments;
}

/**
 * 创建深度部门树
 */
export async function createDeepDepartmentTree(
  depth: number,
  childrenPerLevel: number,
  organizationId: string,
) {
  let currentLevelNodes = [null]; // 根节点

  for (let level = 0; level < depth; level++) {
    const nextLevelNodes = [];

    for (const parentId of currentLevelNodes) {
      const children = await createManyDepartments(
        childrenPerLevel,
        organizationId,
        parentId,
      );
      nextLevelNodes.push(...children.map((c) => c.id));
    }

    currentLevelNodes = nextLevelNodes;
  }

  return currentLevelNodes;
}

/**
 * 清理测试部门
 */
export async function cleanupTestDepartments() {
  await prisma.userDepartment.deleteMany({});
  await prisma.department.deleteMany({});
}

