import { prisma } from "./prisma";

export async function cleanupAfterBoardRemoval(userId: string, boardId: string) {
  const board = await prisma.board.findUnique({ where: { id: boardId }, select: { workspaceId: true } });
  if (!board) return;
  await cleanupWorkspaceIfOrphaned(userId, board.workspaceId);
}

export async function cleanupAfterWorkspaceRemoval(userId: string, workspaceId: string) {
  await prisma.boardMember.deleteMany({ where: { userId, board: { workspaceId } } });

  const workspace = await prisma.workspace.findUnique({ where: { id: workspaceId }, select: { organizationId: true } });
  if (workspace) await cleanupOrganizationIfOrphaned(userId, workspace.organizationId);
}

export async function cleanupAfterOrganizationRemoval(userId: string, organizationId: string) {
  const workspaces = await prisma.workspace.findMany({ where: { organizationId }, select: { id: true } });
  const workspaceIds = workspaces.map((w) => w.id);
  if (workspaceIds.length === 0) return;

  await prisma.boardMember.deleteMany({ where: { userId, board: { workspaceId: { in: workspaceIds } } } });
  await prisma.workspaceMember.deleteMany({ where: { userId, workspaceId: { in: workspaceIds } } });
}

async function cleanupWorkspaceIfOrphaned(userId: string, workspaceId: string) {
  const remainingBoardMemberships = await prisma.boardMember.count({
    where: { userId, board: { workspaceId } },
  });
  if (remainingBoardMemberships > 0) return;

  const workspaceMembership = await prisma.workspaceMember.findUnique({
    where: { workspaceId_userId: { workspaceId, userId } },
  });
  if (!workspaceMembership || workspaceMembership.role !== "MEMBER") return;

  await prisma.workspaceMember.delete({ where: { workspaceId_userId: { workspaceId, userId } } });

  const workspace = await prisma.workspace.findUnique({ where: { id: workspaceId }, select: { organizationId: true } });
  if (workspace) await cleanupOrganizationIfOrphaned(userId, workspace.organizationId);
}

async function cleanupOrganizationIfOrphaned(userId: string, organizationId: string) {
  const remainingWorkspaceMemberships = await prisma.workspaceMember.count({
    where: { userId, workspace: { organizationId } },
  });
  if (remainingWorkspaceMemberships > 0) return;

  const orgMembership = await prisma.organizationMember.findUnique({
    where: { organizationId_userId: { organizationId, userId } },
  });
  if (!orgMembership || orgMembership.role !== "MEMBER") return;

  await prisma.organizationMember.delete({ where: { organizationId_userId: { organizationId, userId } } });
}
