import "server-only";
import { redirect } from "next/navigation";
import { auth } from "@/auth";
import type { Session } from "next-auth";
import type { PermissionKey } from "@/lib/rbac/catalog";

/** Aktuelle Session (oder null). */
export async function getSession(): Promise<Session | null> {
  return auth();
}

/** Erzwingt eine eingeloggte Session — leitet sonst zum Login um. */
export async function requireSession(): Promise<Session> {
  const session = await auth();
  if (!session?.user) redirect("/login");
  return session;
}

/** Prüft eine Berechtigung gegen eine Session (ohne DB). */
export function sessionCan(
  session: Session | null,
  permission: PermissionKey,
): boolean {
  return Boolean(session?.user?.permissions?.includes(permission));
}

/**
 * Erzwingt Login UND eine konkrete Berechtigung.
 * Nicht eingeloggt → /login. Eingeloggt, aber kein Recht → /dashboard.
 */
export async function requirePermission(
  permission: PermissionKey,
): Promise<Session> {
  const session = await requireSession();
  if (!session.user.permissions?.includes(permission)) {
    redirect("/dashboard");
  }
  return session;
}

/**
 * Erzwingt Login UND mindestens eine der angegebenen Berechtigungen.
 */
export async function requireAnyPermission(
  permissions: PermissionKey[],
): Promise<Session> {
  const session = await requireSession();
  const granted = session.user.permissions ?? [];
  if (!permissions.some((p) => granted.includes(p))) {
    redirect("/dashboard");
  }
  return session;
}

/** Prüft, ob die Session eine bestimmte Rolle besitzt. */
export function sessionHasRole(
  session: Session | null,
  roleKey: string,
): boolean {
  return Boolean(session?.user?.roles?.includes(roleKey));
}
