import { prisma } from "@/lib/prisma";
import { slugify, randomSuffix } from "@/lib/slug";
import { generateAndSaveQrCode } from "@/lib/qrcode";
import { sendPharmacyWelcomeEmail } from "@/lib/email";
import { resolveBaseUrl } from "@/lib/base-url";

async function uniqueSlugFor(name: string): Promise<string> {
  const base = slugify(name) || "pharmacie";
  let candidate = base;
  // On tente le slug propre d'abord, puis on ajoute un suffixe si déjà pris.
  for (let attempt = 0; attempt < 5; attempt++) {
    const existing = await prisma.pharmacy.findUnique({ where: { slug: candidate } });
    if (!existing) return candidate;
    candidate = `${base}-${randomSuffix(4)}`;
  }
  return `${base}-${randomSuffix(8)}`;
}

/**
 * Active une pharmacie : génère son slug unique et son QR code patient,
 * passe le statut à ACTIVE, et envoie l'email de bienvenue.
 */
export async function activatePharmacy(pharmacyId: string, baseUrlOverride?: string) {
  const pharmacy = await prisma.pharmacy.findUniqueOrThrow({ where: { id: pharmacyId } });
  const base = baseUrlOverride ?? (await resolveBaseUrl());

  const slug = pharmacy.slug && pharmacy.status !== "PENDING" ? pharmacy.slug : await uniqueSlugFor(pharmacy.name);
  const qrCodeUrl = await generateAndSaveQrCode(slug, base);

  const updated = await prisma.pharmacy.update({
    where: { id: pharmacyId },
    data: { status: "ACTIVE", slug, qrCodeUrl },
  });

  await sendPharmacyWelcomeEmail({
    to: pharmacy.contactEmail,
    pharmacyName: pharmacy.name,
    loginUrl: `${base}/connexion`,
  });

  return updated;
}
