import prisma from '../config/db.js';
import type { CreateWbsBody, UpdateWbsBody } from '../validators/wbs.validator.js';
import type { Pagination } from '../utils/pagination.js';

export interface WbsListFilter {
  projectId?: number;
  // 'root' = only nodes with no parent; a number = only direct children of
  // that node; undefined = no filtering on parent at all.
  parentId?: number | 'root';
}

function parentWhere(parentId: WbsListFilter['parentId']) {
  if (parentId === 'root') return { parentId: null };
  if (typeof parentId === 'number') return { parentId };
  return {};
}

export function createWbs(data: CreateWbsBody) {
  return prisma.wbs.create({ data });
}

export function getWbsItems({ skip, take }: Pick<Pagination, 'skip' | 'take'>, filter: WbsListFilter) {
  return prisma.wbs.findMany({
    where: { ...(filter.projectId ? { projectId: filter.projectId } : {}), ...parentWhere(filter.parentId) },
    orderBy: { code: 'asc' },
    skip,
    take,
  });
}

export function countWbsItems(filter: WbsListFilter) {
  return prisma.wbs.count({
    where: { ...(filter.projectId ? { projectId: filter.projectId } : {}), ...parentWhere(filter.parentId) },
  });
}

export function getWbsById(id: number) {
  return prisma.wbs.findUnique({ where: { id } });
}

export function updateWbs(id: number, data: UpdateWbsBody) {
  return prisma.wbs.update({ where: { id }, data });
}

export async function deleteWbs(id: number) {
  await prisma.wbs.delete({ where: { id } });
}
