import { connectDB } from "@/lib/db";
import { Order } from "@/models/Order";
import { Invoice } from "@/models/Invoice";
import { Todo } from "@/models/Todo";
import { QmSubmission } from "@/models/QmSubmission";
import { Notification } from "@/models/Notification";
import { IntranetArticle } from "@/models/IntranetArticle";
import type { Permission } from "@/lib/permissions";

// Extrahiert aus admin/page.tsx (Web-Dashboard) — von dort UND von der
// Team-App-API (api/team/v1/dashboard) genutzt, damit beide Wege exakt
// dieselben Zahlen und dieselben Permission-Gates verwenden, keine zweite
// Implementierung, die auseinanderdriften könnte.
export async function getDashboardStats(viewerId: string, permissions: Record<Permission, boolean>) {
  await connectDB();

  const monthStart = new Date(new Date().getFullYear(), new Date().getMonth(), 1);
  const now = new Date();
  const in7Days = new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000);

  const [
    openOrdersCount,
    openPaymentsCount,
    recentOrders,
    upcomingAppointments,
    myTodos,
    monthPaidOrders,
    pendingQm,
    recentNotifications,
    intranetCount,
  ] = await Promise.all([
    permissions.orders_view ? Order.countDocuments({ archived: false, rejected: false }) : 0,
    permissions.orders_view ? Order.countDocuments({ archived: false, rejected: false, compensationType: "paid", paid: false }) : 0,
    permissions.orders_view
      ? Order.find({ archived: false, rejected: false }).sort({ createdAt: -1 }).limit(4).select("characterOrConcept tag createdAt").lean()
      : [],
    permissions.orders_view
      ? Order.find({ shootDate: { $gte: now, $lte: in7Days }, rejected: false })
          .sort({ shootDate: 1 })
          .limit(4)
          .select("characterOrConcept shootDate clientId")
          .lean()
      : [],
    Todo.find({ $or: [{ assignedToId: viewerId }, { createdById: viewerId }], status: { $ne: "done" } })
      .sort({ dueDate: 1, priority: 1 })
      .limit(4)
      .select("title dueDate priority status")
      .lean(),
    permissions.statistics ? Order.find({ paid: true, paidAt: { $gte: monthStart } }).select("_id").lean() : [],
    permissions.qm || permissions.hr ? QmSubmission.countDocuments({ status: "pending" }) : 0,
    Notification.find({ recipientId: viewerId }).sort({ createdAt: -1 }).limit(4).lean(),
    IntranetArticle.countDocuments({ visible: true }),
  ]);

  let monthRevenue = 0;
  if (permissions.statistics && monthPaidOrders.length > 0) {
    const invoices = await Invoice.find({ orderId: { $in: monthPaidOrders.map((o) => o._id) } })
      .select("totalAmount")
      .lean();
    monthRevenue = invoices.reduce((sum, inv) => sum + inv.totalAmount, 0);
  }

  const unreadNotifications = recentNotifications.filter((n) => !n.read).length;

  return {
    openOrdersCount,
    openPaymentsCount,
    recentOrders,
    upcomingAppointments,
    myTodos,
    pendingQm,
    recentNotifications,
    unreadNotifications,
    intranetCount,
    monthRevenue,
    now,
  };
}
