/**
 * 清理顶级组织的直接成员关系
 * 
 * 问题：旧数据中可能存在直接分配到顶级组织（parentId=null）的成员
 * 规则：成员应该只能分配到子部门，不能直接分配到顶级组织
 * 
 * 使用方法：
 * ```bash
 * cd backend
 * npm run ts-node scripts/clean-org-members.ts
 * ```
 */

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

const prisma = new PrismaClient();

async function main() {
  console.log('🔍 开始检查顶级组织的直接成员...\n');

  // 1. 查找所有顶级组织（parentId = null）
  const topLevelOrgs = await prisma.department.findMany({
    where: {
      parentId: null,
      deletedAt: null,
    },
    select: {
      id: true,
      name: true,
      code: true,
    },
  });

  console.log(`📊 找到 ${topLevelOrgs.length} 个顶级组织\n`);

  let totalDeletedCount = 0;

  // 2. 检查每个顶级组织的直接成员
  for (const org of topLevelOrgs) {
    const directMembers = await prisma.userDepartment.findMany({
      where: {
        departmentId: org.id,
      },
      include: {
        user: {
          select: {
            id: true,
            username: true,
            displayName: true,
            email: true,
          },
        },
      },
    });

    if (directMembers.length > 0) {
      console.log(`⚠️  组织 "${org.name}" (${org.code}) 有 ${directMembers.length} 个直接成员:`);
      
      for (const member of directMembers) {
        console.log(`   - ${member.user.displayName || member.user.username} (${member.user.email})`);
      }

      // 3. 删除这些成员关系
      const deleteResult = await prisma.userDepartment.deleteMany({
        where: {
          departmentId: org.id,
        },
      });

      console.log(`   ✅ 已删除 ${deleteResult.count} 条成员关系\n`);
      totalDeletedCount += deleteResult.count;
    } else {
      console.log(`✅ 组织 "${org.name}" (${org.code}) 没有直接成员\n`);
    }
  }

  console.log('\n📊 清理完成统计:');
  console.log(`   - 检查的顶级组织: ${topLevelOrgs.length}`);
  console.log(`   - 删除的成员关系: ${totalDeletedCount}`);
  
  if (totalDeletedCount > 0) {
    console.log('\n💡 提示: 这些用户需要重新分配到具体的子部门');
  } else {
    console.log('\n✅ 数据正常，无需清理');
  }
}

main()
  .catch((error) => {
    console.error('❌ 清理失败:', error);
    process.exit(1);
  })
  .finally(async () => {
    await prisma.$disconnect();
  });

