import type { CategorizedFilters, Filter, } from "../../../types/destinationFilterAndSort" import type { DestinationPagesHotelData } from "../../../types/hotel" const HOTEL_SURROUNDINGS_FILTER_TYPE_NAMES = [ "Hotel surroundings", "Hotel omgivelser", "Hotelumgebung", "Hotellia lähellä", "Hotellomgivelser", "Omgivningar", ] const HOTEL_FACILITIES_FILTER_TYPE_NAMES = [ "Hotel facilities", "Hotellfaciliteter", "Hotelfaciliteter", "Hotel faciliteter", "Hotel-Infos", "Hotellin palvelut", ] export function getFiltersFromHotels( hotels: DestinationPagesHotelData[] ): CategorizedFilters { if (hotels.length === 0) { return { facilityFilters: [], surroundingsFilters: [] } } const filters = hotels.flatMap(({ hotel }) => hotel.detailedFacilities) const uniqueFilterNames = [...new Set(filters.map((filter) => filter.name))] const filterList = uniqueFilterNames .map((filterName) => { const filter = filters.find((filter) => filter.name === filterName) return filter ? { name: filter.name, slug: filter.slug, filterType: filter.filter, sortOrder: filter.sortOrder, } : null }) .filter((filter): filter is Filter => !!filter) const facilityFilters = filterList.filter((filter) => HOTEL_FACILITIES_FILTER_TYPE_NAMES.includes(filter.filterType) ) const surroundingsFilters = filterList.filter((filter) => HOTEL_SURROUNDINGS_FILTER_TYPE_NAMES.includes(filter.filterType) ) return { facilityFilters: sortFilters(facilityFilters), surroundingsFilters: sortFilters(surroundingsFilters), } } function sortFilters(filters: Filter[]): Filter[] { return [...filters].sort((a, b) => { // First sort by sortOrder const orderDiff = a.sortOrder - b.sortOrder // If sortOrder is the same, sort by name as secondary criterion return orderDiff === 0 ? a.name.localeCompare(b.name) : orderDiff }) }