import type { WorkOrderAdvancedFilters } from "@/domain/work-orders/types/work-order-advanced-filters"; import type { LocationOption, VendorDropdownItem, } from "@/domain/work-orders/types/work-order-common"; import type { WorkOrderBoardSearchQueryParams } from "@/domain/work-orders/types/work-order-board"; import { BOARD_SEARCH_MAX_PAGE_SIZE, toBoardSearchQueryParams, } from "@/domain/work-orders/utils/board-query-params"; import { resolveSiteCode } from "@/domain/work-orders/mappers/work-order-board-mapper"; export type ResolvedBoardSearchParamsInput = { advApplied: WorkOrderAdvancedFilters | null; search: string; page: number; pageSize: number; sortBy: string; sortDir: string; locations: LocationOption[]; vendors: VendorDropdownItem[]; }; function resolveSiteCodes(sites: Set, locations: LocationOption[]): Set { const siteCodes = new Set(); for (const siteKey of sites) { const location = locations.find((item) => String(item.id) === siteKey); if (location) { const code = resolveSiteCode({ siteCode: location.siteCode, name: location.name }); if (code) { siteCodes.add(code); } } else if (siteKey.trim()) { siteCodes.add(siteKey); } } return siteCodes; } function buildVendorIdsByCompanyName(vendors: VendorDropdownItem[]): Map { const vendorIdsByCompanyName = new Map(); for (const vendor of vendors) { const id = Number(vendor.id); if (Number.isFinite(id) && vendor.companyName) { vendorIdsByCompanyName.set(vendor.companyName, id); } } return vendorIdsByCompanyName; } /** Resolves advanced-filter site keys/vendor names to API-ready board/search query params. */ export function buildResolvedBoardSearchParams( input: ResolvedBoardSearchParamsInput, ): WorkOrderBoardSearchQueryParams | null { const { advApplied } = input; if (!advApplied) { return null; } const siteCodes = resolveSiteCodes(advApplied.sites, input.locations); const vendorIdsByCompanyName = buildVendorIdsByCompanyName(input.vendors); return toBoardSearchQueryParams({ filters: { ...advApplied, sites: siteCodes }, search: input.search, page: input.page, pageSize: Math.min(input.pageSize || BOARD_SEARCH_MAX_PAGE_SIZE, BOARD_SEARCH_MAX_PAGE_SIZE), sortBy: input.sortBy || "scheduledDate", sortDir: input.sortDir || "asc", vendorIdsByCompanyName, }); }