"use server";

import { prisma } from "@/lib/prisma";

/** Assigns an invoice number to the order if it doesn't already have one, using the stored prefix/counter. Idempotent. */
export async function ensureInvoiceNumber(orderId: string): Promise<string> {
  const order = await prisma.order.findUniqueOrThrow({ where: { id: orderId } });
  if (order.invoiceNumber) return order.invoiceNumber;

  const settings = await prisma.invoiceSettings.findFirst();
  const prefix = settings?.prefix ?? "INV";
  const nextNumber = settings?.nextNumber ?? 1;
  const invoiceNumber = `${prefix}-${String(nextNumber).padStart(4, "0")}`;

  await prisma.$transaction([
    prisma.order.update({ where: { id: orderId }, data: { invoiceNumber } }),
    settings
      ? prisma.invoiceSettings.update({ where: { id: settings.id }, data: { nextNumber: nextNumber + 1 } })
      : prisma.invoiceSettings.create({ data: { nextNumber: nextNumber + 1 } }),
  ]);

  return invoiceNumber;
}
