"use server";
import { eq } from "drizzle-orm";
import { revalidatePath } from "next/cache";
import { cookies, headers } from "next/headers";
import { auth } from "@/lib/auth";
import { sessionIsImpersonated } from "@/lib/auth/impersonation-guard";
import { user as userTable } from "@/lib/db/auth-schema";
import { db } from "@/lib/db/client";
import { isLocale, type Locale } from "./config";
import { LOCALE_COOKIE } from "./locale";

export async function setUserLocale(locale: Locale): Promise<void> {
  if (!isLocale(locale)) throw new Error(`Invalid locale: ${locale}`);
  (await cookies()).set(LOCALE_COOKIE, locale, {
    path: "/",
    sameSite: "lax",
    maxAge: 60 * 60 * 24 * 365,
  });
  // Le cookie ci-dessus reste posé même en impersonation : c'est la langue de
  // l'onglet de l'opérateur, elle est légitime. En revanche `session.user` EST
  // la cible pendant une impersonation — persister `locale` réécrirait
  // durablement la préférence du client.
  const session = await auth.api.getSession({ headers: await headers() });
  if (session?.user?.id && !sessionIsImpersonated(session)) {
    await db
      .update(userTable)
      .set({ locale })
      .where(eq(userTable.id, session.user.id));
  }
  revalidatePath("/", "layout");
}
