import { requireSession } from "@/lib/auth/session";
import { prisma } from "@/lib/prisma";
import { visibleNavGroups } from "@/lib/navigation";
import { ROLES, type RoleKey } from "@/lib/rbac/catalog";
import { getPresence } from "@/lib/presence.server";
import { getNewModules } from "@/lib/settings";
import { isPersonnelManager } from "@/lib/personnel/access";
import { TopNav } from "@/components/layout/TopNav";
import { Footer } from "@/components/layout/Footer";
import { ScrollReveal } from "@/components/ui/ScrollReveal";
import { DialogHost } from "@/components/ui/Dialog";
import { PresenceHeartbeat } from "@/components/layout/PresenceHeartbeat";

export default async function AppLayout({
  children,
}: Readonly<{ children: React.ReactNode }>) {
  const session = await requireSession();
  const perms = session.user.permissions;

  const me = await prisma.user.findUnique({
    where: { id: session.user.id },
    select: { avatarUrl: true },
  });

  // Eigener Status: bei Urlaub/Abwesenheit lila, sonst online (man ist ja aktiv).
  const rawPresence = await getPresence(session.user.id);
  const selfPresence = rawPresence === "vacation" ? "vacation" : "online";

  // Personalverwaltung nur für Chefs (mit Unterstellten oder Genehmigungsrecht).
  const [canPersonnel, newModules] = await Promise.all([
    isPersonnelManager(session.user.id, perms),
    getNewModules(),
  ]);
  const forced = new Set<string>(canPersonnel ? ["/personnel"] : []);
  const navGroups = visibleNavGroups(perms, forced, new Set(newModules));

  // Höchste (rangniedrigste) Rolle als Anzeige-Label bestimmen.
  const roleKeys = (session.user.roles ?? []).filter(
    (k): k is RoleKey => k in ROLES,
  );
  const topRole = roleKeys.sort((a, b) => ROLES[a].rank - ROLES[b].rank)[0];
  const roleLabel = topRole ? ROLES[topRole].name : "Mitglied";

  return (
    <div className="flex min-h-dvh flex-col">
      <TopNav
        groups={navGroups}
        user={{
          name: session.user.name ?? "Unbekannt",
          email: session.user.email ?? "",
          roleLabel,
          avatarUrl: me?.avatarUrl ?? null,
          presence: selfPresence,
        }}
      />
      <div className="container-app w-full flex-1 py-5">{children}</div>
      <Footer />
      <ScrollReveal />
      <DialogHost />
      <PresenceHeartbeat />
    </div>
  );
}
