import { NextRequest, NextResponse } from "next/server";
import { connectDB } from "@/lib/db";
import { Order } from "@/models/Order";
import { CalendarEvent } from "@/models/CalendarEvent";
import { Calendar } from "@/models/Calendar";
import { dayKey } from "@/lib/calendarGrid";

// Öffentlich, rein binäre Frei/Belegt-Anzeige ohne Kundennamen oder sonstige
// Details — siehe AvailabilityCalendar.tsx. Nimmt den ersten der zwei
// angezeigten Monate entgegen und liefert die belegten Tage für dieses und
// das folgende Monat.
export async function GET(req: NextRequest) {
  const now = new Date();
  const yearParam = parseInt(req.nextUrl.searchParams.get("year") || "", 10);
  const monthParam = parseInt(req.nextUrl.searchParams.get("month") || "", 10);
  const requested = Number.isFinite(yearParam) && Number.isFinite(monthParam) ? new Date(yearParam, monthParam, 1) : now;

  // Nie vor den aktuellen Monat zurück, nie mehr als 6 Monate voraus (siehe
  // AvailabilityCalendar.tsx) — hier zusätzlich serverseitig geprüft, falls
  // die Route mal direkt mit beliebigen Parametern aufgerufen wird.
  const earliestMonth = new Date(now.getFullYear(), now.getMonth(), 1);
  const latestMonth = new Date(now.getFullYear(), now.getMonth() + 5, 1);
  const rangeStart = requested < earliestMonth ? earliestMonth : requested > latestMonth ? latestMonth : requested;
  const rangeEnd = new Date(rangeStart.getFullYear(), rangeStart.getMonth() + 2, 1);

  await connectDB();
  const [orders, publicCalendars] = await Promise.all([
    Order.find({ rejected: false, shootDate: { $gte: rangeStart, $lt: rangeEnd } }).select("shootDate shootEndDate").lean(),
    Calendar.find({ kind: "custom" }).select("_id").lean(),
  ]);
  const events = await CalendarEvent.find({
    calendarId: { $in: publicCalendars.map((c) => c._id) },
    start: { $lt: rangeEnd },
    $or: [{ end: { $gte: rangeStart } }, { end: null, start: { $gte: rangeStart } }],
  })
    .select("start end")
    .lean();

  const busyDays = new Set<string>();
  const markBusy = (start: Date, end: Date | null) => {
    const last = end && end.getTime() > start.getTime() ? end : start;
    for (let d = new Date(start); dayKey(d) <= dayKey(last); d.setDate(d.getDate() + 1)) busyDays.add(dayKey(d));
  };
  for (const o of orders) markBusy(new Date(o.shootDate as Date), o.shootEndDate ? new Date(o.shootEndDate) : null);
  for (const e of events) markBusy(new Date(e.start), e.end ? new Date(e.end) : null);

  return NextResponse.json({
    year: rangeStart.getFullYear(),
    month: rangeStart.getMonth(),
    busyDays: [...busyDays],
  });
}
