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 { CustomerCsrfProvider, CustomerCsrfSync } from "../_components/customer-csrf-provider";
import { CustomerLayoutShell } from "../_components/customer-layout-shell";
import { UiPrefsSessionHydrator } from "../_components/ui-prefs-session-hydrator";
import { getCustomerSessionContext } from "@/lib/frontend-auth/server";
import { tenantCookieName } from "@/lib/frontend-auth/constants";
import { CUSTOMER_CSRF_COOKIE } from "@/lib/server/request-guards";

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 csrfCookieName = tenantCookieName(CUSTOMER_CSRF_COOKIE, tenant);
  const csrfTokenRaw = cookieStore.get(csrfCookieName)?.value ?? null;
  let csrfToken: string | null = null;
  if (csrfTokenRaw) {
    try {
      csrfToken = decodeURIComponent(csrfTokenRaw);
    } catch {
      csrfToken = csrfTokenRaw;
    }
  }
  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 (
    <CustomerCsrfProvider token={csrfToken}>
      <CustomerCsrfSync token={csrfToken} />
      <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>
    </CustomerCsrfProvider>
  );
}
