import { connectDB } from "@/lib/db";
import { Client } from "@/models/Client";
import { Position } from "@/models/Position";
import { Notification, type NotificationType } from "@/models/Notification";
import type { Permission } from "@/lib/permissions";

// Gleiche Logik wie adminAuth.ts getAllPermissions(), nur umgekehrt: nicht
// "welche Rechte hat dieser Mitarbeiter", sondern "welche Mitarbeiter haben
// dieses Recht" — für die Benachrichtigungs-Verteilung. Staff ohne Position
// oder mit permissions:null gilt wie überall sonst als voll berechtigt.
export async function getStaffIdsWithPermission(permission: Permission): Promise<string[]> {
  await connectDB();
  const [staff, positions] = await Promise.all([
    Client.find({ role: "staff" }).select("positionId").lean(),
    Position.find({}).select("permissions").lean(),
  ]);
  const positionById = new Map(positions.map((p) => [String(p._id), p]));

  return staff
    .filter((s) => {
      if (!s.positionId) return true;
      const position = positionById.get(String(s.positionId));
      if (!position || !position.permissions) return true;
      return position.permissions.includes(permission);
    })
    .map((s) => String(s._id));
}

async function createNotifications(recipientIds: string[], data: { type: NotificationType; title: string; body?: string; link?: string }) {
  if (recipientIds.length === 0) return;
  await connectDB();
  await Notification.insertMany(
    recipientIds.map((recipientId) => ({
      recipientId,
      type: data.type,
      title: data.title,
      body: data.body || "",
      link: data.link || "",
    }))
  );
}

export async function notifyStaffWithPermission(
  permission: Permission,
  data: { type: NotificationType; title: string; body?: string; link?: string }
) {
  const ids = await getStaffIdsWithPermission(permission);
  await createNotifications(ids, data);
}

export async function notifyRecipient(
  recipientId: string,
  data: { type: NotificationType; title: string; body?: string; link?: string }
) {
  await createNotifications([recipientId], data);
}

export async function notifyRecipients(
  recipientIds: string[],
  data: { type: NotificationType; title: string; body?: string; link?: string }
) {
  await createNotifications([...new Set(recipientIds)].filter(Boolean), data);
}
