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

function randomCode(): string {
  const chars = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"; // ohne verwechselbare Zeichen (0/O, 1/I)
  let out = "";
  for (let i = 0; i < 6; i++) out += chars[Math.floor(Math.random() * chars.length)];
  return `RAKKU-${out}`;
}

// Lazy statt bei der Registrierung vergeben — damit Bestandskonten (von vor
// Einführung des Empfehlungsprogramms) beim ersten Aufruf einfach nachträglich
// einen Code bekommen, ohne ein Backfill-Skript zu brauchen.
//
// Erst ab dem ersten eigenen Auftrag vergeben — sonst könnte sich jede:r ein
// frisches Konto anlegen, sofort einen Empfehlungscode ziehen und über ein
// zweites Konto gegen sich selbst einlösen, ohne je echte:r Kunde gewesen zu
// sein. Gibt bis dahin "" zurück (kein Code angelegt/gespeichert), damit
// nicht schon vorab unbenutzbare Codes im Umlauf sind.
export async function getOrCreateReferralCode(clientId: string): Promise<string> {
  await connectDB();
  const client = await Client.findById(clientId).select("referralCode").lean();
  if (client?.referralCode) return client.referralCode;

  const hasOrdered = (await Order.countDocuments({ clientId })) > 0;
  if (!hasOrdered) return "";

  let code = randomCode();
  while (await Client.findOne({ referralCode: code })) code = randomCode();

  await Client.findByIdAndUpdate(clientId, { referralCode: code });
  return code;
}
