import type { ReactNode } from "react";

import { cookies } from "next/headers";

import { SIDEBAR_COLLAPSIBLE_VALUES, SIDEBAR_VARIANT_VALUES } from "@/lib/preferences/layout";
import { getPreference } from "@/server/server-actions";

import { CustomerLayoutShell } from "../_components/customer-layout-shell";
import { UiPrefsSessionHydrator } from "../_components/ui-prefs-session-hydrator";
import { getCustomerSessionContext } from "@/lib/frontend-auth/server";

type LayoutProps = {
  children: ReactNode;
  params: Promise<{ tenant: string }>;
};

export default async function TenantCustomerLayout({ children, params }: Readonly<LayoutProps>) {
  const { tenant } = await params;
  const cookieStore = await cookies();
  const defaultOpen = cookieStore.get("sidebar_state")?.value !== "false";
  const session = await getCustomerSessionContext(tenant);
  const [cookieVariant, cookieCollapsible] = await Promise.all([
    getPreference("sidebar_variant", SIDEBAR_VARIANT_VALUES, "inset"),
    getPreference("sidebar_collapsible", SIDEBAR_COLLAPSIBLE_VALUES, "icon"),
  ]);

  // Admin impersonation keeps the admin's Appearance cookies; don't adopt the customer's.
  const adoptSessionUiPrefs = session.impersonationType !== "admin";
  const variant =
    adoptSessionUiPrefs && session.uiPrefs?.sidebar_variant
      ? session.uiPrefs.sidebar_variant
      : cookieVariant;
  const collapsible =
    adoptSessionUiPrefs && session.uiPrefs?.sidebar_collapsible
      ? session.uiPrefs.sidebar_collapsible
      : cookieCollapsible;

  const sessionUser = session.user
    ? {
        name: session.user.name?.trim() || session.user.email || "Customer",
        email: session.user.email ?? "",
        avatar: "",
      }
    : null;

  const portalActorUser = session.user
    ? {
        is_corporate_portal_actor: session.user.is_corporate_portal_actor,
        account_type: session.user.account_type,
      }
    : null;

  return (
    <CustomerLayoutShell
      tenant={tenant}
      defaultOpen={defaultOpen}
      variant={variant}
      collapsible={collapsible}
      sessionUser={sessionUser}
      portalActorUser={portalActorUser}
      portalCapabilities={session.permissions.capabilities ?? null}
      impersonated={session.impersonated}
      impersonationType={session.impersonationType}
      impersonationOwnerName={session.impersonationOwner?.name ?? null}
      navigation={session.permissions.navigation}
      allowedRoutes={session.permissions.routes}
      canUsePortfolioScope={Boolean(session.permissions.capabilities?.portfolio_scope)}
    >
      <UiPrefsSessionHydrator
        uiPrefs={adoptSessionUiPrefs ? session.uiPrefs : null}
        userId={session.user?.id ?? null}
      />
      {children}
    </CustomerLayoutShell>
  );
}
