// packages/commerce-catalog-react/src/useProductList.tsx
import type { CatalogFilter, Page, Product } from '@platform-modules/commerce-catalog'
import { useCatalogContext } from './CatalogProvider.js'
import { useAsyncResource } from './useAsyncResource.js'

export function useProductList(
  filter: CatalogFilter,
  seed?: { initialData?: Page<Product> },
): { page: Page<Product> | null; loading: boolean; error: Error | null; reload: () => void } {
  const { client } = useCatalogContext('useProductList')
  // Key contract: value-based over the WHOLE filter. JSON.stringify auto-covers every
  // CatalogFilter field — a hand-listed subset would silently go stale the moment a field
  // is added (the subset-key bug). Distinct filter values → distinct key → correct refetch;
  // identical values → identical key → no spurious fetch. NEVER key on the object reference.
  const key = `list:${JSON.stringify(filter)}`
  const fetcher = () => client.listProducts(filter)
  const { data, loading, error, reload } = useAsyncResource<Page<Product>>(fetcher, key, seed)
  return { page: data, loading, error, reload }
}
