import * as React from "react";
import { redirect } from "next/navigation";
import { headers } from "next/headers";
import { getAdminSession } from "@/lib/admin/auth";
import { AdminHeader } from "@/components/admin/admin-header";
import { AdminSidebar } from "@/components/admin/admin-sidebar";
import { AdminIdleLock } from "@/components/admin/admin-idle-lock";
import { AdminLocationProvider } from "@/components/admin/admin-location-provider";
import { db } from "@/lib/admin/db";
import { bootstrapMainAdmin } from "@/lib/admin/bootstrap";

export const dynamic = "force-dynamic";

export default async function AdminLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  // Ensure bootstrap exists
  await bootstrapMainAdmin();

  const sessionCtx = await getAdminSession();
  const headerList = await headers();
  const pathname = headerList.get("x-pathname") || "";
  const isPublicAdminRoute =
    pathname === "/admin/login" || pathname === "/admin/change-password";

  // If unauthenticated and accessing any protected admin route: clean redirect
  if (!sessionCtx) {
    if (pathname && !isPublicAdminRoute) {
      redirect("/admin/login?reason=unauthorized");
    }
    return (
      <div className="min-h-screen bg-white text-neutral-900 antialiased dark:bg-neutral-950 dark:text-neutral-100 font-sans">
        <div className="flex min-h-screen flex-col items-center justify-center p-4">
          {children}
        </div>
      </div>
    );
  }

  return (
    <div className="min-h-screen bg-white text-neutral-900 antialiased dark:bg-neutral-950 dark:text-neutral-100 font-sans">
      <AdminAuthenticatedShell sessionCtx={sessionCtx}>
        {children}
      </AdminAuthenticatedShell>
    </div>
  );
}

import { AdminAuthProvider } from "@/components/admin/admin-auth-provider";
import { getUserPermissions } from "@/lib/admin/permissions";

async function AdminAuthenticatedShell({
  sessionCtx,
  children,
}: {
  sessionCtx: NonNullable<Awaited<ReturnType<typeof getAdminSession>>>;
  children: React.ReactNode;
}) {
  const { user } = sessionCtx;
  const userPermissions = getUserPermissions(user);

  let pendingResetCount = 0;
  if (user.level === "MAIN_ADMIN") {
    const allReqs = await db.getResetRequests();
    const now = new Date().toISOString();
    pendingResetCount = allReqs.filter(
      (r) => r.status === "PENDING" && r.expiresAt > now
    ).length;
  }

  return (
    <AdminAuthProvider
      initialSession={{
        user: {
          id: user.id,
          email: user.email,
          name: user.name,
          level: user.level,
          role: user.role,
          status: user.status,
          twoFactorEnabled: user.twoFactorEnabled,
          webauthnCredentials: user.webauthnCredentials,
          pinHash: user.pinHash,
          displayName: user.displayName,
          jobTitle: user.jobTitle,
          avatarUrl: user.avatarUrl,
          avatarMediaId: user.avatarMediaId,
          socials: user.socials,
          createdAt: user.createdAt,
          lastLoginAt: user.lastLoginAt,
        },
        session: {
          id: sessionCtx.session.id,
          device: sessionCtx.session.device,
          browser: sessionCtx.session.browser,
          createdAt: sessionCtx.session.createdAt,
          lastActiveAt: sessionCtx.session.lastActiveAt,
          isLocked: Boolean(sessionCtx.session.isLocked),
          lockedAt: sessionCtx.session.lockedAt,
        },
        permissions: userPermissions,
        pendingResetRequestsCount: pendingResetCount,
      }}
    >
      <AdminIdleLock
        userEmail={user.email}
        userName={user.name}
        initialLocked={Boolean(sessionCtx.session.isLocked)}
      />
      <AdminLocationProvider>
        <div className="min-h-screen flex flex-col">
          <AdminHeader
            user={{
              id: user.id,
              name: user.name,
              email: user.email,
              level: user.level,
              role: user.role,
            }}
            pendingResetRequestsCount={pendingResetCount}
          />
          <div className="flex flex-1">
            <AdminSidebar
              user={{
                level: user.level,
                role: user.role,
              }}
              pendingResetRequestsCount={pendingResetCount}
            />
            <main className="flex-1 overflow-y-auto p-6 md:p-8 bg-neutral-50/40 dark:bg-neutral-950/40">
              <div className="mx-auto max-w-6xl">{children}</div>
            </main>
          </div>
        </div>
      </AdminLocationProvider>
    </AdminAuthProvider>
  );
}
