import { NextRequest, NextResponse } from "next/server";
import { z } from "zod";
import bcrypt from "bcryptjs";
import { prisma } from "@/lib/prisma";
import { stripe, stripeConfigured, createPharmacyCheckoutSession } from "@/lib/stripe";
import { activatePharmacy } from "@/lib/pharmacy-activation";
import { resolveBaseUrl } from "@/lib/base-url";

const bodySchema = z.object({
  name: z.string().min(2),
  siret: z.string().optional(),
  address: z.string().optional(),
  phone: z.string().optional(),
  contactEmail: z.string().email(),
  password: z.string().min(8),
});

export async function POST(req: NextRequest) {
  const parsed = bodySchema.safeParse(await req.json().catch(() => null));
  if (!parsed.success) {
    return NextResponse.json({ error: "Formulaire invalide." }, { status: 400 });
  }
  const { name, siret, address, phone, contactEmail, password } = parsed.data;

  const existingUser = await prisma.user.findUnique({ where: { email: contactEmail } });
  if (existingUser) {
    return NextResponse.json({ error: "Un compte existe déjà avec cet email." }, { status: 409 });
  }

  const passwordHash = await bcrypt.hash(password, 10);

  const pharmacy = await prisma.pharmacy.create({
    data: {
      name,
      siret,
      address,
      phone,
      contactEmail,
      status: "PENDING",
      slug: `pending-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
    },
  });

  await prisma.user.create({
    data: {
      email: contactEmail,
      passwordHash,
      role: "PHARMACY",
      pharmacyId: pharmacy.id,
    },
  });

  const baseUrl = await resolveBaseUrl(req);

  if (stripeConfigured && stripe) {
    const session = await createPharmacyCheckoutSession({
      pharmacyId: pharmacy.id,
      pharmacyName: name,
      contactEmail,
      baseUrl,
    });
    return NextResponse.json({ checkoutUrl: session.url });
  }

  // Pas de Stripe configuré (dev / avant création du compte Stripe) : on active directement.
  await activatePharmacy(pharmacy.id, baseUrl);
  return NextResponse.json({ checkoutUrl: null, activatedWithoutPayment: true });
}
