"use client";

import type { ComponentProps, ReactNode } from "react";

import { usePathname } from "next/navigation";

import { CustomerPortalSessionProvider } from "@/app/customer/_components/customer-portal-session-context";
import { CustomerTutorialProvider } from "@/components/customer-tutorial";
import { DashboardSidebarShell } from "@/components/layout/dashboard-sidebar-shell";
import { AppSidebar } from "@/components/sidebar/app-sidebar";
import type {
  CustomerPortalActorUser,
  CustomerPortalCapabilities,
} from "@/lib/frontend-auth/report-capabilities";
import { isCustomerLoginWithoutTenant } from "@/lib/tenant";
import type { InitialMenuLayout } from "@/app/customer/_lib/initial-menu-layout";
import type { CustomerNavigationPayload } from "@/navigation/sidebar/dynamic-sidebar";

type CustomerLayoutShellProps = {
  children: ReactNode;
  tenant: string;
  defaultOpen: boolean;
  variant: ComponentProps<typeof AppSidebar>["variant"];
  collapsible: ComponentProps<typeof AppSidebar>["collapsible"];
  sessionUser?: {
    name: string;
    email: string;
    avatar: string;
  } | null;
  portalActorUser?: CustomerPortalActorUser;
  portalCapabilities?: CustomerPortalCapabilities | null;
  impersonated?: boolean;
  impersonationType?: "admin" | "corporate" | null;
  impersonationOwnerName?: string | null;
  navigation?: CustomerNavigationPayload;
  allowedRoutes?: readonly string[];
  /** Server-resolved Default layout, so the sidebar's first paint is already the right menu. */
  initialMenuLayout?: InitialMenuLayout | null;
  /** From guest/me — show Scope immediately without waiting on options API. */
  canUsePortfolioScope?: boolean;
  /**
   * The idle/expiry guard, built server-side by `PortalSessionGuard` (the same component the
   * staff dashboard mounts). Passed in as a node because the shell is a client component.
   */
  sessionGuard?: ReactNode;
};

function isCustomerAuthSurface(pathname: string, tenant: string): boolean {
  if (isCustomerLoginWithoutTenant(pathname)) {
    return true;
  }

  if (pathname === "/customer/impersonate" || pathname.startsWith("/customer/impersonate?")) {
    return true;
  }

  return new RegExp(`^/customer/${tenant}/(login|impersonate)$`).test(pathname);
}

export function CustomerLayoutShell({
  children,
  tenant,
  defaultOpen,
  variant,
  collapsible,
  sessionUser,
  portalActorUser = null,
  portalCapabilities = null,
  impersonated = false,
  impersonationType = null,
  impersonationOwnerName = null,
  navigation,
  allowedRoutes,
  initialMenuLayout = null,
  canUsePortfolioScope = false,
  sessionGuard = null,
}: CustomerLayoutShellProps) {
  const pathname = usePathname();

  if (isCustomerAuthSurface(pathname, tenant)) {
    return children;
  }

  const tutorialUserKey = sessionUser?.email?.trim() || "anonymous";

  return (
    <CustomerPortalSessionProvider user={portalActorUser} capabilities={portalCapabilities}>
      {sessionGuard}
      <CustomerTutorialProvider
        tenant={tenant}
        userKey={tutorialUserKey}
        navigation={navigation}
        allowedRoutes={allowedRoutes}
        canUsePortfolioScope={canUsePortfolioScope}
      >
        <DashboardSidebarShell
          defaultOpen={defaultOpen}
          variant={variant}
          collapsible={collapsible}
          sessionUser={sessionUser}
          impersonated={impersonated}
          impersonationType={impersonationType}
          impersonationOwnerName={impersonationOwnerName}
          navigation={navigation}
          allowedRoutes={allowedRoutes}
          customerTenant={tenant}
          initialMenuLayout={initialMenuLayout}
          canUsePortfolioScope={canUsePortfolioScope}
        >
          {children}
        </DashboardSidebarShell>
      </CustomerTutorialProvider>
    </CustomerPortalSessionProvider>
  );
}
