import { useState, useEffect } from 'react'; import { useSearchParams, useNavigate } from 'react-router-dom'; import { Header } from '@/components/layout/Header'; import { Button } from '@/components/ui/button'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Search, Filter, SlidersHorizontal } from 'lucide-react'; import { AutocompleteSearch } from '@/components/search/AutocompleteSearch'; import { SearchFiltersComponent, SearchFilters } from '@/components/search/SearchFilters'; import { SearchSortOptions, SortOption } from '@/components/search/SearchSortOptions'; import { EnhancedSearchResults } from '@/components/search/EnhancedSearchResults'; import { useSearch, SearchResult } from '@/hooks/useSearch'; import { useOpenGraph } from '@/hooks/useOpenGraph'; export default function SearchPage() { const [searchParams] = useSearchParams(); const navigate = useNavigate(); const initialQuery = searchParams.get('q') || ''; const [activeTab, setActiveTab] = useState('all'); const [filters, setFilters] = useState({}); const [sort, setSort] = useState({ field: 'relevance', direction: 'desc' }); const [showFilters, setShowFilters] = useState(false); const { query, setQuery, results, loading, search } = useSearch({ types: ['park', 'ride', 'company'], limit: 50 }); useEffect(() => { if (initialQuery) { setQuery(initialQuery); } }, [initialQuery, setQuery]); // Filter and sort results const filteredAndSortedResults = (() => { let filtered = results.filter(result => activeTab === 'all' || result.type === activeTab ); // Apply filters if (filters.country) { filtered = filtered.filter(result => result.subtitle?.toLowerCase().includes(filters.country!.toLowerCase()) ); } if (filters.stateProvince) { filtered = filtered.filter(result => result.subtitle?.toLowerCase().includes(filters.stateProvince!.toLowerCase()) ); } if (filters.ratingMin !== undefined || filters.ratingMax !== undefined) { filtered = filtered.filter(result => { if (!result.rating) return false; const rating = result.rating; const min = filters.ratingMin ?? 0; const max = filters.ratingMax ?? 5; return rating >= min && rating <= max; }); } // Type-safe helpers for sorting const getReviewCount = (data: unknown): number => { if (data && typeof data === 'object' && 'review_count' in data) { const count = (data as { review_count?: number }).review_count; return typeof count === 'number' ? count : 0; } return 0; }; const getRideCount = (data: unknown): number => { if (data && typeof data === 'object' && 'ride_count' in data) { const count = (data as { ride_count?: number }).ride_count; return typeof count === 'number' ? count : 0; } return 0; }; const getOpeningDate = (data: unknown): number => { if (data && typeof data === 'object' && 'opening_date' in data) { const dateStr = (data as { opening_date?: string }).opening_date; return dateStr ? new Date(dateStr).getTime() : 0; } return 0; }; // Sort results filtered.sort((a, b) => { const direction = sort.direction === 'asc' ? 1 : -1; switch (sort.field) { case 'name': return direction * a.title.localeCompare(b.title); case 'rating': return direction * ((b.rating || 0) - (a.rating || 0)); case 'reviews': return direction * (getReviewCount(b.data) - getReviewCount(a.data)); case 'rides': return direction * (getRideCount(b.data) - getRideCount(a.data)); case 'opening': return direction * (getOpeningDate(b.data) - getOpeningDate(a.data)); default: // relevance return 0; // Keep original order for relevance } }); return filtered; })(); const resultCounts = { all: results.length, park: results.filter(r => r.type === 'park').length, ride: results.filter(r => r.type === 'ride').length, company: results.filter(r => r.type === 'company').length }; useOpenGraph({ title: query ? `Search: "${query}" - ThrillWiki` : 'Search - ThrillWiki', description: query ? `Found ${filteredAndSortedResults.length} results for "${query}"` : 'Search theme parks, rides, and more on ThrillWiki', type: 'website', enabled: !loading }); return (
{/* Search Header */}

Search

{query && (

Showing {filteredAndSortedResults.length} results for "{query}"

)} {/* Search Bar */}
{ const params = new URLSearchParams(); params.set('q', newQuery); navigate(`/search?${params.toString()}`, { replace: true }); }} />
{/* Results Section */} {query && (
{/* Tabs and Controls */}
All ({resultCounts.all}) Parks ({resultCounts.park}) Rides ({resultCounts.ride}) Companies ({resultCounts.company})
{/* Layout Grid */}
{/* Filters Sidebar */} {showFilters && (
)} {/* Results */}
{!loading && filteredAndSortedResults.length === 0 && query && (

No results found

Try adjusting your search terms or filters

)}
)} {/* Initial State */} {!query && (

Start your search

Search for theme parks, rides, or companies to get started

)}
); }