import { isProductPackageType } from '@/lib/material-type-mapper' type TaskDetailAssetLike = { assetType?: string | null } type TaskDetailUploadGroups = { main?: ArrayLike | null sku?: ArrayLike | null detail?: ArrayLike | null } const TASK_DETAIL_FULL_SET_GROUPS = { main: new Set(['main-preview', 'main']), sku: new Set(['sku-preview', 'sku']), detail: new Set(['detail-preview', 'detail']), } as const function hasUploadItems(items: ArrayLike | null | undefined): boolean { return Boolean(items && typeof items.length === 'number' && items.length > 0) } export function isTaskDetailFullSetFromUploadGroups( groups: TaskDetailUploadGroups | null | undefined, ): boolean { return ( hasUploadItems(groups?.main) && hasUploadItems(groups?.sku) && hasUploadItems(groups?.detail) ) } export function isTaskDetailFullSetFromAssetTypes( assetTypes: Array, ): boolean { let hasMain = false let hasSku = false let hasDetail = false for (const assetType of assetTypes) { if (!assetType) { continue } if (TASK_DETAIL_FULL_SET_GROUPS.main.has(assetType as 'main-preview' | 'main')) { hasMain = true } if (TASK_DETAIL_FULL_SET_GROUPS.sku.has(assetType as 'sku-preview' | 'sku')) { hasSku = true } if (TASK_DETAIL_FULL_SET_GROUPS.detail.has(assetType as 'detail-preview' | 'detail')) { hasDetail = true } if (hasMain && hasSku && hasDetail) { return true } } return false } export function isTaskDetailFullSetFromAssets( assets: TaskDetailAssetLike[] | null | undefined, ): boolean { if (!Array.isArray(assets) || assets.length === 0) { return false } return isTaskDetailFullSetFromAssetTypes(assets.map((asset) => asset?.assetType)) } export function deriveTaskDetailIsFullSet( materialType: string | null | undefined, assets: TaskDetailAssetLike[] | null | undefined, fallback = false, ): boolean { if (!isProductPackageType(materialType || '')) { return false } if (Array.isArray(assets)) { return isTaskDetailFullSetFromAssets(assets) } return Boolean(fallback) }