"use client";

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

import { usePathname } from "next/navigation";

import { CustomerPortalSessionProvider } from "@/app/customer/_components/customer-portal-session-context";
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 { 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[];
  /** From guest/me — show Scope immediately without waiting on options API. */
  canUsePortfolioScope?: boolean;
};

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,
  canUsePortfolioScope = false,
}: CustomerLayoutShellProps) {
  const pathname = usePathname();

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

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