import { redirect } from "next/navigation";
import type { ReactNode } from "react";
import { HireWizardProvider } from "@/components/hire/HireWizardContext";
import { AppShell } from "@/components/shell/AppShell";
import { currentUserId } from "@/lib/auth/session";
import { withUser } from "@/lib/db";
import { loadOpenNotes } from "@/lib/notes";
import { loadOpenPositions } from "@/lib/positions";

export default async function AppLayout({ children }: { children: ReactNode }) {
  const userId = await currentUserId();
  if (!userId) redirect("/login");

  // Alles in *einer* Transaktion, weil nur dort der Sitzungskontext gilt —
  // und damit nebenbei auf einem einheitlichen Lesestand.
  const data = await withUser(userId, async (tx) => {
    // Hier — und nicht im Proxy — fällt die Entscheidung über den Zugang.
    // Der Proxy prüft nur, ob überhaupt jemand angemeldet ist; er hat keine
    // Datenbankverbindung. Diese Abfrage läuft bei jedem Aufbau frisch, eine
    // entzogene Freischaltung wirkt also sofort statt erst mit dem nächsten
    // Sitzungstoken. Die eigentliche Grenze bleibt darunter RLS.
    const profile = await tx
      .selectFrom("profiles")
      .select(["full_name", "email", "role", "is_active"])
      .where("id", "=", userId)
      .executeTakeFirst();
    if (profile?.role !== "hr" || profile?.is_active !== true) return null;

    const [openPositions, locations, drafts, openNotes] = await Promise.all([
      loadOpenPositions(tx),
      tx.selectFrom("locations").select(["id", "name", "country"]).orderBy("name").execute(),
      tx
        .selectFrom("hire_drafts")
        .select(["id", "step", "payload", "updated_at"])
        .where("created_by", "=", userId)
        .orderBy("updated_at", "desc")
        .execute(),
      loadOpenNotes(tx),
    ]);

    return { profile, openPositions, locations, drafts, openNotes };
  });

  // `data` ist null, wenn die Person angemeldet, aber nicht freigeschaltet
  // ist. Ohne den Grund in der Adresse stünde sie vor einer wortlosen
  // Anmeldeseite und versuchte es endlos erneut.
  if (!data) redirect("/login?error=no_hr_access");

  const userLabel = data.profile.full_name || data.profile.email || "";

  return (
    <HireWizardProvider openPositions={data.openPositions} locations={data.locations} drafts={data.drafts}>
      <AppShell userLabel={userLabel} openNotes={data.openNotes}>
        {children}
      </AppShell>
    </HireWizardProvider>
  );
}
