// One-off repair: retroactively cleans up MEMBER-level workspace/org
// memberships that were left behind by board/workspace removals performed
// before the automatic cascade cleanup existed. Never touches ADMIN/OWNER
// roles — only auto-granted MEMBER access with nothing left backing it.
import { prisma } from "../src/lib/prisma";

async function main() {
  console.log("Scanning for orphaned MEMBER-level workspace memberships...");

  const workspaceMembers = await prisma.workspaceMember.findMany({
    where: { role: "MEMBER" },
    select: { id: true, userId: true, workspaceId: true },
  });

  let removedWorkspaceMemberships = 0;
  for (const wm of workspaceMembers) {
    const boardCount = await prisma.boardMember.count({
      where: { userId: wm.userId, board: { workspaceId: wm.workspaceId } },
    });
    if (boardCount === 0) {
      await prisma.workspaceMember.delete({ where: { id: wm.id } });
      removedWorkspaceMemberships++;
      console.log(`  removed orphaned WorkspaceMember: user=${wm.userId} workspace=${wm.workspaceId}`);
    }
  }

  console.log("Scanning for orphaned MEMBER-level organization memberships...");

  const orgMembers = await prisma.organizationMember.findMany({
    where: { role: "MEMBER" },
    select: { id: true, userId: true, organizationId: true },
  });

  let removedOrgMemberships = 0;
  for (const om of orgMembers) {
    const wsCount = await prisma.workspaceMember.count({
      where: { userId: om.userId, workspace: { organizationId: om.organizationId } },
    });
    if (wsCount === 0) {
      await prisma.organizationMember.delete({ where: { id: om.id } });
      removedOrgMemberships++;
      console.log(`  removed orphaned OrganizationMember: user=${om.userId} org=${om.organizationId}`);
    }
  }

  console.log(
    `Done. Removed ${removedWorkspaceMemberships} orphaned workspace membership(s), ${removedOrgMemberships} orphaned org membership(s).`
  );
}

main()
  .then(() => process.exit(0))
  .catch((err) => {
    console.error(err);
    process.exit(1);
  });
