import prisma from './prisma';
import { syncWorkerRankScore } from './workerRank';

export async function getWorkerReviewStats(workerId: string) {
  return prisma.review.aggregate({
    where: { workerId },
    _avg: { overallRating: true },
    _count: true,
  });
}

export async function syncWorkerReviewStats(workerId: string) {
  const stats = await getWorkerReviewStats(workerId);
  await prisma.workerProfile.update({
    where: { id: workerId },
    data: {
      totalReviews: stats._count,
      averageRating: stats._avg.overallRating ?? 0,
    },
  });
  await syncWorkerRankScore(workerId);
  return stats;
}

export async function syncAllWorkerReviewStats() {
  const workers = await prisma.workerProfile.findMany({
    where: { deletedAt: null },
    select: { id: true },
  });
  for (const worker of workers) {
    await syncWorkerReviewStats(worker.id);
  }
}

export function applyReviewStats<T extends { totalReviews: number; averageRating: number }>(
  worker: T,
  stats: { _count: number; _avg: { overallRating: number | null } }
): T {
  return {
    ...worker,
    totalReviews: stats._count,
    averageRating: stats._avg.overallRating ?? 0,
  };
}
