// src/app/onboarding/defer/route.ts — la porte de sortie du wizard.
//
// Sans elle, le gate dérivé (src/lib/onboarding/wizard-gate.ts) enferme : toute
// page de l'app renvoie vers /onboarding tant que les étapes requises manquent,
// et le wizard n'a, lui, aucun moyen de les remplir avant que les étapes de
// données ne soient écrites. Réglages, support, facturation, création de site :
// tout devient inatteignable. Cette route est la sortie minimale, et elle est
// délibérément un lien serveur, pas un `document.cookie` :
//   - une sortie de secours ne doit pas dépendre du JavaScript de l'étape en
//     cours (un `throw` au rendu avalé par une garde d'erreur a déjà coûté cher
//     à ce projet) ;
//   - un simple <a href> fonctionne même si l'hydratation échoue.
//
// Le cookie est httpOnly : il n'a aucun lecteur client, et le seul producteur
// légitime est cette route.
//
// Le paramètre `to` existe pour les sorties QUI ONT UNE DESTINATION : « je
// préfère importer depuis le réservoir », « je veux changer de forfait ». Il
// est validé (resolveDeferDestination) — non validé, il ferait de cette route
// une redirection ouverte servie par notre domaine, cookie de session en prime.
import { cookies } from "next/headers";
import { redirect } from "next/navigation";
import {
  DEFER_COOKIE,
  DEFER_COOKIE_VALUE,
  resolveDeferDestination,
} from "@/lib/onboarding/wizard-gate";

export async function GET(request: Request) {
  const store = await cookies();
  store.set({
    name: DEFER_COOKIE,
    value: DEFER_COOKIE_VALUE,
    path: "/",
    httpOnly: true,
    sameSite: "lax",
    secure: process.env.NODE_ENV === "production",
    // NI `maxAge` NI `expires` : cookie de session, il meurt à la fermeture du
    // navigateur. « Plus tard » ne doit jamais pouvoir devenir « plus jamais ».
  });
  // Le report est posé AVANT toute décision sur la destination : une valeur de
  // `to` refusée ne doit pas coûter la sortie, seulement l'atterrissage choisi.
  const destination = resolveDeferDestination(
    new URL(request.url).searchParams.get("to"),
  );
  // Hors du try/catch (il n'y en a pas ici, mais la règle vaut) : redirect()
  // lève en interne, l'attraper avalerait la redirection.
  redirect(destination);
}
