import { prisma } from "../../config/prisma";
import { TaskStatus } from "@prisma/client";

export async function getTaskStatsByClient(clientId: string) {
  const now = new Date();
  const dueSoonEnd = new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000);

  const [total, byStatus, completed, pendingReview, overdue, dueSoon] =
    await Promise.all([
      prisma.task.count({ where: { clientId } }),
      prisma.task.groupBy({
        by: ["status"],
        where: { clientId },
        _count: { _all: true },
      }),
      prisma.task.count({
        where: { clientId, status: "COMPLETED" },
      }),
      prisma.task.count({
        where: { clientId, status: "CLIENT_APPROVAL" },
      }),
      prisma.task.count({
        where: {
          clientId,
          dueDate: { lt: now },
          status: { notIn: ["COMPLETED", "REJECTED"] },
        },
      }),
      prisma.task.count({
        where: {
          clientId,
          dueDate: { gte: now, lte: dueSoonEnd },
          status: { notIn: ["COMPLETED", "REJECTED"] },
        },
      }),
    ]);

  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,
    pendingReview,
    overdue,
    dueSoon,
    byStatus: statusCounts,
  };
}

export async function getTaskTrendByClient(clientId: 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: {
      clientId,
      createdAt: { gte: rangeStart },
    },
    select: { createdAt: true, completedAt: true, status: true },
  });

  // Build empty buckets for each of the last `days` days, oldest first
  const buckets: {
    key: string;
    label: string;
    created: number;
    completed: number;
  }[] = [];
  for (let i = days - 1; i >= 0; i--) {
    const d = new Date(now);
    d.setDate(d.getDate() - i);
    const key = d.toISOString().slice(0, 10); // "2026-08-07"
    buckets.push({
      key,
      label: d.toLocaleDateString("en-IN", { day: "2-digit", month: "short" }), // "07 Aug"
      created: 0,
      completed: 0,
    });
  }

  const bucketMap = new Map(buckets.map((b) => [b.key, b]));

  for (const task of tasks) {
    const createdKey = task.createdAt.toISOString().slice(0, 10);
    const createdBucket = bucketMap.get(createdKey);
    if (createdBucket) createdBucket.created += 1;

    if (task.completedAt) {
      const completedKey = task.completedAt.toISOString().slice(0, 10);
      const completedBucket = bucketMap.get(completedKey);
      if (completedBucket) completedBucket.completed += 1;
    }
  }

  return buckets.map(({ label, created, completed }) => ({
    date: label,
    created,
    completed,
  }));
}
