import type { CategorizedFilters, Filter, SortItem, } from "@/types/components/hotelFilterAndSort" import { SortOption } from "@/types/enums/hotelFilterAndSort" import type { HotelDataWithUrl } from "@/types/hotel" export const SORTING_STRATAGIES: Record< SortOption, (a: HotelDataWithUrl, b: HotelDataWithUrl) => number > = { [SortOption.Name]: function (a, b) { return a.hotel.name.localeCompare(b.hotel.name) }, [SortOption.TripAdvisorRating]: function (a, b) { return ( (b.hotel.ratings?.tripAdvisor.rating ?? 0) - (a.hotel.ratings?.tripAdvisor.rating ?? 0) ) }, [SortOption.Distance]: function (a, b) { return a.hotel.location.distanceToCentre - b.hotel.location.distanceToCentre }, } export function getFilteredHotels( hotels: HotelDataWithUrl[], filters: string[] ) { if (filters.length) { return hotels.filter(({ hotel }) => filters.every((filter) => hotel.detailedFacilities.some((facility) => facility.slug === filter) ) ) } return hotels } export function getSortedHotels( hotels: HotelDataWithUrl[], sortOption: SortOption ) { return hotels.sort(SORTING_STRATAGIES[sortOption]) } export const DEFAULT_SORT = SortOption.Distance export function isValidSortOption( value: string, sortItems: SortItem[] ): value is SortOption { return sortItems.map((item) => item.value).includes(value as SortOption) } 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: HotelDataWithUrl[] ): CategorizedFilters { if (hotels.length === 0) { return { facilityFilters: [], surroundingsFilters: [] } } const filters = hotels.flatMap(({ hotel }) => hotel.detailedFacilities) const sortedFilters = filters.sort((a, b) => b.sortOrder - a.sortOrder) const uniqueFilterNames = [ ...new Set(sortedFilters.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, } : null }) .filter((filter): filter is Filter => !!filter) return { facilityFilters: filterList.filter((filter) => HOTEL_FACILITIES_FILTER_TYPE_NAMES.includes(filter.filterType) ), surroundingsFilters: filterList.filter((filter) => HOTEL_SURROUNDINGS_FILTER_TYPE_NAMES.includes(filter.filterType) ), } } export function getBasePathNameWithoutFilters( pathname: string, filterSlugs: string[] ) { const pathSegments = pathname.split("/") const filteredSegments = pathSegments.filter( (segment) => !filterSlugs.includes(segment) ) return filteredSegments.join("/") }