import { useState, useEffect } from 'react'; import { Card, CardContent } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { MapPin, Star, Search as SearchIcon, Castle, FerrisWheel, Waves, Theater, Factory } from 'lucide-react'; import { Park, Ride, Company } from '@/types/database'; import { supabase } from '@/integrations/supabase/client'; import { useNavigate } from 'react-router-dom'; interface SearchResultsProps { query: string; onClose: () => void; } type SearchResult = { type: 'park' | 'ride' | 'company'; data: Park | Ride | Company; }; export function SearchResults({ query, onClose }: SearchResultsProps) { const [results, setResults] = useState([]); const [loading, setLoading] = useState(false); const navigate = useNavigate(); useEffect(() => { if (query.length >= 2) { searchContent(); } else { setResults([]); } }, [query]); const searchContent = async () => { setLoading(true); try { const searchTerm = `%${query.toLowerCase()}%`; // Search parks const { data: parks } = await supabase .from('parks') .select(`*, location:locations(*)`) .or(`name.ilike.${searchTerm},description.ilike.${searchTerm}`) .limit(5); // Search rides const { data: rides } = await supabase .from('rides') .select(`*, park:parks!inner(name, slug)`) .or(`name.ilike.${searchTerm},description.ilike.${searchTerm}`) .limit(5); // Search companies const { data: companies } = await supabase .from('companies') .select('*') .or(`name.ilike.${searchTerm},description.ilike.${searchTerm}`) .limit(3); const allResults: SearchResult[] = [ ...(parks || []).map(park => ({ type: 'park' as const, data: park })), ...(rides || []).map(ride => ({ type: 'ride' as const, data: ride })), ...(companies || []).map(company => ({ type: 'company' as const, data: company })) ]; setResults(allResults); } catch (error) { console.error('Search error:', error); } finally { setLoading(false); } }; const handleResultClick = (result: SearchResult) => { onClose(); switch (result.type) { case 'park': navigate(`/parks/${(result.data as Park).slug}`); break; case 'ride': const ride = result.data as Ride; if (ride.park && typeof ride.park === 'object' && 'slug' in ride.park) { navigate(`/parks/${ride.park.slug}/rides/${ride.slug}`); } break; case 'company': // Navigate to manufacturer page when implemented console.log('Company clicked:', result.data); break; } }; const getResultIcon = (result: SearchResult) => { switch (result.type) { case 'park': const park = result.data as Park; switch (park.park_type) { case 'theme_park': return ; case 'amusement_park': return ; case 'water_park': return ; default: return ; } case 'ride': const ride = result.data as Ride; switch (ride.category) { case 'roller_coaster': return ; case 'water_ride': return ; case 'dark_ride': return ; default: return ; } case 'company': return ; } }; const getResultTitle = (result: SearchResult) => { return result.data.name; }; const getResultSubtitle = (result: SearchResult) => { switch (result.type) { case 'park': const park = result.data as Park; return park.location ? `${park.location.city}, ${park.location.country}` : 'Theme Park'; case 'ride': const ride = result.data as Ride; return ride.park && typeof ride.park === 'object' && 'name' in ride.park ? `at ${ride.park.name}` : 'Ride'; case 'company': const company = result.data as Company; return company.company_type.replace('_', ' '); } }; const getResultRating = (result: SearchResult) => { if (result.type === 'park' || result.type === 'ride') { const data = result.data as Park | Ride; return data.average_rating > 0 ? data.average_rating : null; } return null; }; if (query.length < 2) { return (

Start typing to search parks, rides, and manufacturers...

); } if (loading) { return (
{[...Array(5)].map((_, i) => (
))}
); } if (results.length === 0) { return (

No results found for "{query}"

Try searching for park names, ride names, or locations

); } return (
{results.map((result, index) => ( handleResultClick(result)} >
{getResultIcon(result)}

{getResultTitle(result)}

{result.type}

{getResultSubtitle(result)}

{getResultRating(result) && (
{getResultRating(result)?.toFixed(1)}
)}
))}
{results.length > 0 && (
)}
); }