import { connectDB } from "@/lib/db";
import { Order } from "@/models/Order";
import { Client } from "@/models/Client";
import { Contract } from "@/models/Contract";
import { RejectionReason } from "@/models/RejectionReason";
import { OrderActivity } from "@/models/OrderActivity";
import { Invoice } from "@/models/Invoice";
import { Reminder } from "@/models/Reminder";
import { PriceTemplate } from "@/models/PriceTemplate";
import { ClientPhotoFolder } from "@/models/ClientPhotoFolder";
import { getPriceState } from "@/lib/priceProposal";
import { getOrderChatMessagesByOrderId } from "@/lib/orderMessages";
import { getSettings } from "@/lib/settings";
import { getAllPermissions } from "@/lib/adminAuth";

// Voller Umfang wie admin/orders/[orderId]/page.tsx — Preis, Zahlung,
// Vertrag, Rechnung, Mahnungen, Chat, Aktivitätslog, Foto-Ordner. Nur das
// ausführliche TFP-Vertragsformular hat eine eigene Route (tfp-contract).
export async function getOrderDetail(orderId: string) {
  await connectDB();
  const order = await Order.findById(orderId).lean();
  if (!order) return null;

  const permissions = await getAllPermissions();

  const [client, priceData, assignedStaff, createdByStaff, totalClientOrders, orderRank, contract, activeReasons, activities, messagesByOrderId, invoice, settings, priceTemplates, photoFolders, clientOrders] =
    await Promise.all([
      Client.findById(order.clientId).lean(),
      getPriceState(orderId),
      order.assignedStaffId ? Client.findById(order.assignedStaffId).select("name").lean() : null,
      order.createdByStaffId ? Client.findById(order.createdByStaffId).select("name").lean() : null,
      Order.countDocuments({ clientId: order.clientId }),
      Order.countDocuments({ clientId: order.clientId, createdAt: { $lte: order.createdAt } }),
      Contract.findOne({ orderId }).lean(),
      RejectionReason.find({ active: true }).sort({ sortOrder: 1 }).lean(),
      OrderActivity.find({ orderId }).sort({ createdAt: -1 }).lean(),
      getOrderChatMessagesByOrderId([orderId]),
      Invoice.findOne({ orderId }).lean(),
      getSettings(),
      permissions.price_templates_view ? PriceTemplate.find({}).sort({ sortOrder: 1 }).lean() : [],
      ClientPhotoFolder.find({ orderId: order._id }).sort({ sortOrder: 1 }).lean(),
      Order.find({ clientId: order.clientId }).select("characterOrConcept").lean(),
    ]);

  const reminders = invoice ? await Reminder.find({ invoiceId: invoice._id }).sort({ createdAt: 1 }).lean() : [];
  const orderMessages = messagesByOrderId.get(orderId) ?? [];

  const latestAmount = priceData.history.length ? priceData.history[priceData.history.length - 1].amount : 0;
  const daysOpen = Math.floor((Date.now() - new Date(order.createdAt).getTime()) / 86_400_000);

  return {
    order,
    client,
    priceData,
    latestAmount,
    assignedStaff,
    createdByStaff,
    totalClientOrders,
    orderRank,
    daysOpen,
    permissions,
    contract: contract
      ? {
          id: String(contract._id),
          type: contract.type,
          status: contract.status,
          // .lean() wendet Mongoose-Defaults nicht an - bei Verträgen von vor
          // der reminders[]-Einführung (22.09.2026) fehlt das Feld im rohen
          // Dokument komplett statt [] zu sein (Fund vom Nutzer, 24.09.2026:
          // Seite crashte beim Öffnen).
          lastReminderAt:
            (contract.reminders || []).length > 0
              ? contract.reminders[contract.reminders.length - 1].sentAt.toISOString()
              : null,
        }
      : null,
    reasonOptions: activeReasons.map((r) => ({ id: String(r._id), label: r.label })),
    activities: activities.map((a) => ({ id: String(a._id), createdAt: a.createdAt.toISOString(), message: a.message, actor: a.actor })),
    orderMessages,
    invoice: invoice
      ? { id: String(invoice._id), number: invoice.number, issueDate: invoice.issueDate.toISOString(), totalAmount: invoice.totalAmount }
      : null,
    reminders: reminders.map((r) => ({
      id: String(r._id),
      level: r.level,
      fee: r.fee || 0,
      amountDue: r.amountDue,
      automatic: r.automatic || false,
      createdAt: r.createdAt.toISOString(),
      dueDate: r.dueDate.toISOString(),
    })),
    nextReminderFee:
      settings.reminderEscalationSettings.levelFees[Math.min(reminders.length, settings.reminderEscalationSettings.levelFees.length - 1)] || 0,
    priceTemplates: priceTemplates.map((t) => ({ id: String(t._id), name: t.name, defaultAmount: t.defaultAmount, note: t.note })),
    photoFolders: photoFolders.map((f) => ({
      id: String(f._id),
      label: f.label,
      nextcloudPath: f.nextcloudPath,
      assignedAt: new Date(f.assignedAt).toISOString(),
      released: Boolean(f.released),
      orderId: f.orderId ? String(f.orderId) : null,
    })),
    clientOrders: clientOrders.map((o) => ({ id: String(o._id), label: o.characterOrConcept })),
  };
}
