import { Order } from "@/models/Order";
import { CalendarEvent } from "@/models/CalendarEvent";
import { Client } from "@/models/Client";
import { formatDateDE } from "@/lib/orderConstants";

const DEFAULT_DURATION_MS = 60 * 60 * 1000;

// Findet überschneidende Auftragstermine oder Kalender-Einträge (z. B.
// Urlaub) — rein informativ, blockiert das Speichern nicht, da sich manche
// Überschneidungen (verschiedene Locations, kurze Pufferzeiten) durchaus
// vertreten lassen und die Entscheidung beim Team bleiben soll.
export async function findScheduleConflict(
  start: Date,
  end: Date | null,
  excludeOrderId: string
): Promise<string | null> {
  const effectiveEnd = end ?? new Date(start.getTime() + DEFAULT_DURATION_MS);

  const overlappingOrders = await Order.find({
    _id: { $ne: excludeOrderId },
    rejected: false,
    shootDate: { $ne: null, $lt: effectiveEnd },
  })
    .select("characterOrConcept shootDate shootEndDate clientId")
    .lean();

  for (const o of overlappingOrders) {
    const oStart = new Date(o.shootDate as Date);
    const oEnd = o.shootEndDate ? new Date(o.shootEndDate) : new Date(oStart.getTime() + DEFAULT_DURATION_MS);
    if (oStart < effectiveEnd && oEnd > start) {
      const client = await Client.findById(o.clientId).select("name").lean();
      return `Überschneidet sich mit „${o.characterOrConcept}" (${client?.name ?? "Kunde"}) am ${oStart.toLocaleString("de-DE", { day: "2-digit", month: "2-digit", hour: "2-digit", minute: "2-digit" })}.`;
    }
  }

  const overlappingEvents = await CalendarEvent.find({
    start: { $lt: effectiveEnd },
    $or: [{ end: { $gt: start } }, { end: null }],
  })
    .select("title start end")
    .lean();

  for (const e of overlappingEvents) {
    const eStart = new Date(e.start);
    const eEnd = e.end ? new Date(e.end) : new Date(eStart.getTime() + DEFAULT_DURATION_MS);
    if (eStart < effectiveEnd && eEnd > start) {
      return `Überschneidet sich mit „${e.title}" im Kalender (${formatDateDE(eStart)}${
        e.end && eEnd.toDateString() !== eStart.toDateString() ? ` – ${formatDateDE(eEnd)}` : ""
      }).`;
    }
  }

  return null;
}
