// @design-system: feedback/Spinner
'use client';
import { createContext, useContext, useMemo, type ReactNode } from 'react';
import type { SpinnerVariant } from './Spinner';
import { useBrowserPathname } from '@/lib/hooks/useHydrated';

export const SpinnerVariantContext = createContext<SpinnerVariant | null>(null);

/**
 * Picks default SpinnerVariant based on pathname:
 * - /admin/*      → bar
 * - /account/*    → dots
 * - /vendor/*     → dots
 * - /__splash     → spot
 * - /loading      → spot
 * - else          → bounce
 */
function variantForPathname(pathname: string): SpinnerVariant {
  if (pathname.startsWith('/admin')) return 'bar';
  if (pathname.startsWith('/account') || pathname.startsWith('/vendor')) return 'dots';
  if (pathname === '/__splash' || pathname === '/loading') return 'spot';
  return 'bounce';
}

export interface RouteSpinnerProviderProps {
  /** Override pathname (useful for SSR). Defaults to window.location.pathname. */
  pathname?: string;
  children: ReactNode;
}

/**
 * RouteSpinnerProvider — wraps a subtree and provides a default SpinnerVariant
 * based on the current route. Spinner reads this via context when no `variant`
 * prop is passed.
 *
 * @example
 * ```tsx
 * <RouteSpinnerProvider>
 *   <App />
 * </RouteSpinnerProvider>
 * ```
 */
export function RouteSpinnerProvider({ pathname, children }: RouteSpinnerProviderProps) {
  const browserPathname = useBrowserPathname();
  const resolvedPathname = pathname ?? browserPathname;
  const variant = useMemo(() => variantForPathname(resolvedPathname), [resolvedPathname]);

  return (
    <SpinnerVariantContext.Provider value={variant}>{children}</SpinnerVariantContext.Provider>
  );
}

/** Hook to read the current default SpinnerVariant from context. */
export function useSpinnerVariant(): SpinnerVariant {
  return useContext(SpinnerVariantContext) ?? 'bounce';
}
