import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { Card, CardContent } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Star, MapPin, Zap, Factory, Clock, Users, Calendar, Ruler, Gauge, Building } from 'lucide-react'; import { SearchResult } from '@/hooks/useSearch'; import { MeasurementDisplay } from '@/components/ui/measurement-display'; interface EnhancedSearchResultsProps { results: SearchResult[]; loading: boolean; hasMore?: boolean; onLoadMore?: () => void; } export function EnhancedSearchResults({ results, loading, hasMore, onLoadMore }: EnhancedSearchResultsProps) { const navigate = useNavigate(); const handleResultClick = (result: SearchResult) => { switch (result.type) { case 'park': navigate(`/parks/${result.slug || result.id}`); break; case 'ride': // Need to get park slug for ride navigation navigate(`/rides/${result.id}`); break; case 'company': navigate(`/companies/${result.id}`); break; } }; const getTypeIcon = (type: string, size = 'w-6 h-6') => { switch (type) { case 'park': return ; case 'ride': return ; case 'company': return ; default: return ; } }; const getTypeColor = (type: string) => { switch (type) { case 'park': return 'bg-primary/10 text-primary border-primary/20'; case 'ride': return 'bg-secondary/10 text-secondary border-secondary/20'; case 'company': return 'bg-accent/10 text-accent border-accent/20'; default: return 'bg-muted text-muted-foreground'; } }; const renderParkDetails = (result: SearchResult) => { if (result.type !== 'park') return null; const parkData = result.data as { ride_count?: number; opening_date?: string; status?: string }; return (
{parkData?.ride_count && (
{parkData.ride_count} rides
)} {parkData?.opening_date && (
Opened {parkData.opening_date.split('-')[0]}
)} {parkData?.status && ( {parkData.status.replace('_', ' ')} )}
); }; const renderRideDetails = (result: SearchResult) => { if (result.type !== 'ride') return null; const rideData = result.data as { category?: string; max_height_meters?: number; max_speed_kmh?: number; intensity_level?: string }; return (
{rideData?.category && ( {rideData.category.replace('_', ' ')} )} {rideData?.max_height_meters && (
)} {rideData?.max_speed_kmh && (
)} {rideData?.intensity_level && ( {rideData.intensity_level} )}
); }; const renderCompanyDetails = (result: SearchResult) => { if (result.type !== 'company') return null; const companyData = result.data as { company_type?: string; founded_year?: number; headquarters_location?: string }; return (
{companyData?.company_type && ( {companyData.company_type.replace('_', ' ')} )} {companyData?.founded_year && (
Founded {companyData.founded_year}
)} {companyData?.headquarters_location && (
{companyData.headquarters_location}
)}
); }; if (loading && results.length === 0) { return (
); } if (results.length === 0) { return null; } return (
{results.map((result) => ( handleResultClick(result)} className="group cursor-pointer hover:shadow-lg hover:shadow-primary/10 transition-all duration-300 border-border/50 hover:border-primary/50" >
{/* Image placeholder or actual image */}
{result.image ? ( {result.title} ) : (
{getTypeIcon(result.type, 'w-8 h-8')}
)}
{/* Content */}

{result.title}

{result.type}

{result.subtitle}

{/* Type-specific details */} {result.type === 'park' && renderParkDetails(result)} {result.type === 'ride' && renderRideDetails(result)} {result.type === 'company' && renderCompanyDetails(result)}
{/* Rating */} {result.rating && result.rating > 0 && (
{result.rating.toFixed(1)} {result.data?.review_count && ( ({result.data.review_count}) )}
)}
))}
{/* Load More Button */} {hasMore && (
)}
); }