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 ? (

) : (
{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 && (
)}
);
}