import { connectDB } from "@/lib/db";
import { Order } from "@/models/Order";
import { Client } from "@/models/Client";
import { Calendar } from "@/models/Calendar";
import { CalendarEvent } from "@/models/CalendarEvent";

// Bewusst kein 1:1-Nachbau des Monats-Rasters aus admin/calendar/page.tsx
// (mehrtägige Termine über Tage aufspannen, +N-mehr-Kürzung, Sichtbarkeits-
// Auswahl je Kalender — viel UI-Eigenlogik für einen Nutzen, den Mitarbeiter
// am Desktop eher selten brauchen: "was kommt als Nächstes"). Stattdessen
// zwei schlanke Listen, die genau das direkt beantworten. Volles Monatsraster
// bleibt der Web-Ansicht vorbehalten (siehe "Vollansicht im Browser öffnen").
export async function getUpcomingShoots(limit = 20) {
  await connectDB();
  const now = new Date();
  const orders = await Order.find({ shootDate: { $gte: now }, rejected: false })
    .sort({ shootDate: 1 })
    .limit(limit)
    .select("characterOrConcept shootDate shootEndDate eventLocation clientId tag")
    .lean();

  const clientIds = [...new Set(orders.map((o) => String(o.clientId)))];
  const clients = clientIds.length ? await Client.find({ _id: { $in: clientIds } }).select("name").lean() : [];
  const clientById = new Map(clients.map((c) => [String(c._id), c]));

  return orders.map((o) => ({
    _id: String(o._id),
    characterOrConcept: o.characterOrConcept,
    shootDate: o.shootDate,
    shootEndDate: o.shootEndDate ?? null,
    eventLocation: o.eventLocation,
    tag: o.tag,
    clientName: clientById.get(String(o.clientId))?.name ?? null,
  }));
}

// Der "Urlaub"-Blick auf der Webseite ist einfach der eine als publicVisible
// markierte Custom-Kalender (kein separates Modell, siehe Kommentar in
// admin/calendar/page.tsx) — hier dasselbe, nur ohne die Monats-Rasterlogik.
export async function getVacationPeriods(limit = 30) {
  await connectDB();
  const calendar = await Calendar.findOne({ kind: "custom", publicVisible: true }).lean();
  if (!calendar) return { calendarName: null, events: [] as never[] };

  const events = await CalendarEvent.find({ calendarId: calendar._id })
    .sort({ start: 1 })
    .limit(limit)
    .lean();

  return {
    calendarName: calendar.name,
    events: events.map((e) => ({ _id: String(e._id), title: e.title, start: e.start, end: e.end ?? null, allDay: e.allDay })),
  };
}
