"use server";

import { eq } from "drizzle-orm";
import { redirect } from "next/navigation";
import { requireClient } from "@/lib/guards";
import { db, schema } from "@/lib/db";
import { createCheckoutSession, isStripeConfigured } from "@/lib/stripe";

/**
 * Crée une session Stripe Checkout pour régler une facture existante (acompte
 * resté impayé en mode virement, ou solde après prestation).
 *
 * Sécurité : on revérifie que la facture appartient bien au client connecté.
 * Si Stripe n'est pas configuré, on redirige avec un flag erreur (le client
 * devra payer par virement).
 */
export async function payInvoiceAction(formData: FormData): Promise<void> {
  const invoiceId = formData.get("invoiceId");
  if (typeof invoiceId !== "string" || !invoiceId) {
    redirect("/espace-client/factures?error=invalid");
  }

  const session = await requireClient();

  const [inv] = await db
    .select()
    .from(schema.invoice)
    .where(eq(schema.invoice.id, invoiceId))
    .limit(1);

  if (!inv || inv.clientId !== session.user.id) {
    redirect("/espace-client/factures?error=notfound");
  }
  if (inv.status !== "envoyee") {
    redirect("/espace-client/factures?error=already");
  }

  if (!isStripeConfigured()) {
    redirect("/espace-client/factures?error=stripe");
  }

  // Récupère la référence dossier (facultative — si la facture n'est pas liée
  // à un dossier on met une chaîne neutre).
  let dossierReference = "—";
  let dossierId = inv.dossierId ?? "";
  if (inv.dossierId) {
    const [d] = await db
      .select({ reference: schema.dossier.reference })
      .from(schema.dossier)
      .where(eq(schema.dossier.id, inv.dossierId))
      .limit(1);
    if (d) dossierReference = d.reference;
  }

  const baseUrl = process.env.BETTER_AUTH_URL ?? "http://localhost:3001";

  const checkout = await createCheckoutSession({
    dossierReference,
    dossierId,
    invoiceId: inv.id,
    invoiceNumber: inv.number,
    label: inv.description ?? `Facture ${inv.number}`,
    amountCents: inv.amountCents,
    customerEmail: session.user.email,
    successUrl: `${baseUrl}/espace-client/factures?paid=${inv.number}`,
    cancelUrl: `${baseUrl}/espace-client/factures?canceled=1`,
  });

  if (!checkout.url) {
    redirect("/espace-client/factures?error=stripe");
  }

  // Mémorise l'ID de session pour le webhook
  if (checkout.sessionId) {
    await db
      .update(schema.invoice)
      .set({ paymentReference: checkout.sessionId, updatedAt: new Date() })
      .where(eq(schema.invoice.id, inv.id));
  }

  redirect(checkout.url);
}
