import { prisma } from "../../config/prisma";
import { TaskStatus, DocumentStatus } from "@prisma/client";

export async function getTaskStatsByEmployee(employeeId: string) {
  const now = new Date();
  const dueSoonEnd = new Date(now.getTime() + 3 * 24 * 60 * 60 * 1000);

  const [total, byStatus, completed, overdue, dueSoon, pendingDocVerification] =
    await Promise.all([
      prisma.task.count({ where: { assignedEmployeeId: employeeId } }),
      prisma.task.groupBy({
        by: ["status"],
        where: { assignedEmployeeId: employeeId },
        _count: { _all: true },
      }),
      prisma.task.count({
        where: { assignedEmployeeId: employeeId, status: TaskStatus.COMPLETED },
      }),
      prisma.task.count({
        where: {
          assignedEmployeeId: employeeId,
          dueDate: { lt: now },
          status: { notIn: [TaskStatus.COMPLETED, TaskStatus.REJECTED] },
        },
      }),
      prisma.task.count({
        where: {
          assignedEmployeeId: employeeId,
          dueDate: { gte: now, lte: dueSoonEnd },
          status: { notIn: [TaskStatus.COMPLETED, TaskStatus.REJECTED] },
        },
      }),
      prisma.document.count({
        where: {
          task: { assignedEmployeeId: employeeId },
          status: { in: [DocumentStatus.UPLOADED, DocumentStatus.AI_VERIFIED] },
        },
      }),
    ]);

  const statusCounts: Record<string, number> = {};
  for (const status of Object.values(TaskStatus)) statusCounts[status] = 0;
  for (const row of byStatus) statusCounts[row.status] = row._count._all;

  return {
    total,
    completed,
    overdue,
    dueSoon,
    pendingDocVerification,
    byStatus: statusCounts,
  };
}

export async function getTaskTrendByEmployee(employeeId: string, days = 30) {
  const now = new Date();
  now.setHours(0, 0, 0, 0);
  const rangeStart = new Date(now);
  rangeStart.setDate(rangeStart.getDate() - (days - 1));

  const tasks = await prisma.task.findMany({
    where: {
      assignedEmployeeId: employeeId,
      createdAt: { gte: rangeStart },
    },
    select: { createdAt: true, completedAt: true },
  });

  const buckets: {
    key: string;
    label: string;
    assigned: number;
    completed: number;
  }[] = [];
  for (let i = days - 1; i >= 0; i--) {
    const d = new Date(now);
    d.setDate(d.getDate() - i);
    buckets.push({
      key: d.toISOString().slice(0, 10),
      label: d.toLocaleDateString("en-IN", { day: "2-digit", month: "short" }),
      assigned: 0,
      completed: 0,
    });
  }

  const bucketMap = new Map(buckets.map((b) => [b.key, b]));

  for (const task of tasks) {
    const assignedBucket = bucketMap.get(
      task.createdAt.toISOString().slice(0, 10),
    );
    if (assignedBucket) assignedBucket.assigned += 1;

    if (task.completedAt) {
      const completedBucket = bucketMap.get(
        task.completedAt.toISOString().slice(0, 10),
      );
      if (completedBucket) completedBucket.completed += 1;
    }
  }

  return buckets.map(({ label, assigned, completed }) => ({
    date: label,
    assigned,
    completed,
  }));
}
