import type { ProductVariantInput, TargetingRule, WidgetSizeConfig } from './types'; export function sizeFeatureEnabled( rule: TargetingRule | undefined, categories: string[], productId: string ): boolean { if ( ! rule || ( rule.mode !== 'include' && rule.mode !== 'exclude' ) ) return true; const matched = categories.some( ( category ) => ( rule.categories || [] ).includes( category ) ) || ( rule.productIds || [] ).map( String ).includes( String( productId ) ); return rule.mode === 'include' ? matched : ! matched; } export function sizeGuideForProduct( size: WidgetSizeConfig, categories: string[], variants: ProductVariantInput[] ) { if ( ! Array.isArray( size.guides ) ) { const availableLabels = variants .filter( ( variant ) => variant.available === true ) .map( ( variant ) => variant.size_label ); return size.hasSizeGuide && availableLabels.length > 0 ? { labels: availableLabels } : null; } const assigned = size.guides.find( ( guide ) => ( guide.categories?.categories || [] ).some( ( category ) => categories.includes( category ) ) ); const fallback = size.guides.find( ( guide ) => ( guide.categories?.categories || [] ).length === 0 ); const guide = assigned || fallback || null; if ( ! guide ) return null; return guide.labels.some( ( label ) => variants.some( ( variant ) => variant.available && variant.size_label === label ) ) ? guide : null; } export function isSizeEligible( size: WidgetSizeConfig | undefined, categories: string[], productId: string, variants: ProductVariantInput[] ): boolean { if ( ! size?.hasSizeGuide || ! variants.some( ( variant ) => variant.available === true ) ) return false; return sizeFeatureEnabled( size.targeting, categories, productId ) && sizeGuideForProduct( size, categories, variants ) !== null; } export function sizeGuideResolution( size: WidgetSizeConfig, categories: string[], variants: ProductVariantInput[] ): 'collection' | 'shop_default' | 'none' { const guide = sizeGuideForProduct( size, categories, variants ); if ( ! guide ) return 'none'; if ( ! ( 'categories' in guide ) ) return 'shop_default'; return ( guide.categories?.categories || [] ).length > 0 ? 'collection' : 'shop_default'; }