/**
 * Whether a variant's option values should appear in available_options facets.
 */
export function variantContributesToOptionFacets(
	inventoryTracking: string,
	productInStock: number,
	variantInventoryLevel: number | string | undefined | null
): boolean {
	if (inventoryTracking === "variant") {
		return parseInt(String(variantInventoryLevel ?? 0), 10) > 0;
	}
	if (inventoryTracking === "product") {
		return productInStock === 1;
	}
	return true;
}

/** Build available_options from indexed variants (after in_stock / stock_qty are set). */
export function buildAvailableOptionsFromVariants(
	inventoryTracking: string,
	productInStock: number,
	variants: Array<{ options?: Record<string, string>; stock_qty?: number | string }> | undefined
): Record<string, string[]> {
	const available_options: Record<string, string[]> = {};
	if (!variants?.length) {
		return available_options;
	}
	for (const variant of variants) {
		if (
			!variantContributesToOptionFacets(
				inventoryTracking,
				productInStock,
				variant.stock_qty
			)
		) {
			continue;
		}
		const opts = variant.options || {};
		for (const optionName of Object.keys(opts)) {
			const optionValue = opts[optionName];
			if (optionValue == null || optionValue === "") continue;
			if (!available_options[optionName]) {
				available_options[optionName] = [];
			}
			if (available_options[optionName].indexOf(optionValue) === -1) {
				available_options[optionName].push(optionValue);
			}
		}
	}
	return available_options;
}
