import { Train, Gauge, Ruler, Zap, Calendar, Building, User, ExternalLink, AlertCircle, TrendingUp, Droplets, Sparkles, RotateCw, Baby, Navigation } from 'lucide-react'; import { Badge } from '@/components/ui/badge'; import { Separator } from '@/components/ui/separator'; import { FlexibleDateDisplay } from '@/components/ui/flexible-date-display'; import type { DatePrecision } from '@/components/ui/flexible-date-input'; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible'; import { ChevronDown, ChevronRight } from 'lucide-react'; import type { RideSubmissionData } from '@/types/submission-data'; import { useEffect, useState } from 'react'; import { supabase } from '@/lib/supabaseClient'; interface RichRideDisplayProps { data: RideSubmissionData; actionType: 'create' | 'edit' | 'delete'; showAllFields?: boolean; } export function RichRideDisplay({ data, actionType, showAllFields = true }: RichRideDisplayProps) { const [park, setPark] = useState(null); const [manufacturer, setManufacturer] = useState(null); const [designer, setDesigner] = useState(null); const [model, setModel] = useState(null); const [showCategorySpecific, setShowCategorySpecific] = useState(false); const [showTechnical, setShowTechnical] = useState(false); useEffect(() => { // Guard against null/undefined data if (!data) return; const fetchRelatedData = async () => { if (data.park_id) { const { data: parkData } = await supabase .from('parks') .select('name') .eq('id', data.park_id) .single(); setPark(parkData?.name || null); } if (data.manufacturer_id) { const { data: mfgData } = await supabase .from('companies') .select('name') .eq('id', data.manufacturer_id) .single(); setManufacturer(mfgData?.name || null); } if (data.designer_id) { const { data: designerData } = await supabase .from('companies') .select('name') .eq('id', data.designer_id) .single(); setDesigner(designerData?.name || null); } if (data.ride_model_id) { const { data: modelData } = await supabase .from('ride_models') .select('name') .eq('id', data.ride_model_id) .single(); setModel(modelData?.name || null); } }; fetchRelatedData(); }, [data.park_id, data.manufacturer_id, data.designer_id, data.ride_model_id]); const getStatusColor = (status: string | undefined) => { if (!status) return 'bg-gray-500'; switch (status.toLowerCase()) { case 'operating': return 'bg-green-500'; case 'closed': return 'bg-red-500'; case 'under_construction': return 'bg-blue-500'; case 'sbno': return 'bg-orange-500'; default: return 'bg-gray-500'; } }; // Determine which category-specific section to show const category = data.category?.toLowerCase(); const hasWaterFields = category === 'water_ride' && (data.water_depth_cm || data.splash_height_meters || data.wetness_level || data.flume_type || data.boat_capacity); const hasDarkRideFields = category === 'dark_ride' && (data.theme_name || data.story_description || data.show_duration_seconds || data.animatronics_count || data.projection_type || data.ride_system || data.scenes_count); const hasFlatRideFields = category === 'flat_ride' && (data.rotation_type || data.motion_pattern || data.platform_count || data.swing_angle_degrees || data.rotation_speed_rpm || data.arm_length_meters || data.max_height_reached_meters); const hasKiddieFields = category === 'kiddie_ride' && (data.min_age || data.max_age || data.educational_theme || data.character_theme); const hasTransportFields = category === 'transport_ride' && (data.transport_type || data.route_length_meters || data.stations_count || data.vehicle_capacity || data.vehicles_count || data.round_trip_duration_seconds); const hasTechnicalFields = data.track_material || data.support_material || data.propulsion_method || data.coaster_type || data.seating_type || data.intensity_level; return (
{/* Header Section */}

{data.name}

{park && (
at {park}
)}
{data.category?.replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase())} {data.ride_sub_type && ( {data.ride_sub_type.replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase())} )} {data.status?.replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase())} {actionType === 'create' && ( New Ride )} {actionType === 'edit' && ( Edit )} {actionType === 'delete' && ( Delete )}
{/* Primary Statistics Grid */} {(data.max_height_meters || data.max_speed_kmh || data.length_meters || data.drop_height_meters || data.duration_seconds || data.inversions !== null) && (
{data.max_height_meters && (
Height
{data.max_height_meters.toFixed(1)} m
)} {data.max_speed_kmh && (
Speed
{data.max_speed_kmh.toFixed(1)} km/h
)} {data.length_meters && (
Length
{data.length_meters.toFixed(1)} m
)} {data.drop_height_meters && (
Drop
{data.drop_height_meters.toFixed(1)} m
)} {data.duration_seconds && (
Duration
{Math.floor(data.duration_seconds / 60)}:{(data.duration_seconds % 60).toString().padStart(2, '0')}
)} {data.inversions !== null && data.inversions !== undefined && (
Inversions
{data.inversions}
)}
)} {/* Requirements & Capacity */} {(data.height_requirement || data.age_requirement || data.capacity_per_hour || data.max_g_force) && (
Requirements & Capacity
{data.height_requirement && (
Height Requirement {data.height_requirement} cm
)} {data.age_requirement && (
Min Age {data.age_requirement}+
)} {data.capacity_per_hour && (
Capacity/Hour {data.capacity_per_hour}
)} {data.max_g_force && (
Max G-Force {data.max_g_force}g
)}
)} {/* Technical Details (Collapsible) */} {hasTechnicalFields && ( {showTechnical ? : } Technical Specifications
{data.track_material && data.track_material.length > 0 && (
Track Material
{data.track_material.map((material, i) => ( {material.replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase())} ))}
)} {data.support_material && data.support_material.length > 0 && (
Support Material
{data.support_material.map((material, i) => ( {material.replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase())} ))}
)} {data.propulsion_method && data.propulsion_method.length > 0 && (
Propulsion Method
{data.propulsion_method.map((method, i) => ( {method.replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase())} ))}
)}
{data.coaster_type && (
Coaster Type {data.coaster_type.replace(/_/g, ' ')}
)} {data.seating_type && (
Seating Type {data.seating_type.replace(/_/g, ' ')}
)} {data.intensity_level && (
Intensity Level {data.intensity_level.replace(/_/g, ' ').toUpperCase()}
)}
)} {/* Water Ride Fields */} {hasWaterFields && ( {showCategorySpecific ? : } Water Ride Specifications
{data.water_depth_cm && (
Water Depth {data.water_depth_cm} cm
)} {data.splash_height_meters && (
Splash Height {data.splash_height_meters.toFixed(1)} m
)} {data.wetness_level && (
Wetness Level {data.wetness_level.toUpperCase()}
)} {data.flume_type && (
Flume Type {data.flume_type.replace(/_/g, ' ')}
)} {data.boat_capacity && (
Boat Capacity {data.boat_capacity} riders
)}
)} {/* Dark Ride Fields */} {hasDarkRideFields && ( {showCategorySpecific ? : } Dark Ride Details
{data.theme_name && (
Theme Name {data.theme_name}
)} {data.story_description && (
Story Description

{data.story_description}

)}
{data.show_duration_seconds && (
Show Duration {Math.floor(data.show_duration_seconds / 60)}:{(data.show_duration_seconds % 60).toString().padStart(2, '0')}
)} {data.animatronics_count && (
Animatronics {data.animatronics_count}
)} {data.scenes_count && (
Scenes {data.scenes_count}
)} {data.projection_type && (
Projection Type {data.projection_type.replace(/_/g, ' ')}
)} {data.ride_system && (
Ride System {data.ride_system.replace(/_/g, ' ')}
)}
)} {/* Flat Ride Fields */} {hasFlatRideFields && ( {showCategorySpecific ? : } Flat Ride Specifications
{data.rotation_type && (
Rotation Type {data.rotation_type.replace(/_/g, ' ')}
)} {data.motion_pattern && (
Motion Pattern {data.motion_pattern.replace(/_/g, ' ')}
)} {data.platform_count && (
Platforms {data.platform_count}
)} {data.swing_angle_degrees && (
Swing Angle {data.swing_angle_degrees}°
)} {data.rotation_speed_rpm && (
Rotation Speed {data.rotation_speed_rpm} RPM
)} {data.arm_length_meters && (
Arm Length {data.arm_length_meters.toFixed(1)} m
)} {data.max_height_reached_meters && (
Max Height Reached {data.max_height_reached_meters.toFixed(1)} m
)}
)} {/* Kiddie Ride Fields */} {hasKiddieFields && ( {showCategorySpecific ? : } Kiddie Ride Details
{data.min_age && (
Min Age {data.min_age}
)} {data.max_age && (
Max Age {data.max_age}
)} {data.educational_theme && (
Educational Theme {data.educational_theme}
)} {data.character_theme && (
Character Theme {data.character_theme}
)}
)} {/* Transport Ride Fields */} {hasTransportFields && ( {showCategorySpecific ? : } Transport Ride Specifications
{data.transport_type && (
Transport Type {data.transport_type.replace(/_/g, ' ')}
)} {data.route_length_meters && (
Route Length {data.route_length_meters.toFixed(0)} m
)} {data.stations_count && (
Stations {data.stations_count}
)} {data.vehicle_capacity && (
Vehicle Capacity {data.vehicle_capacity}
)} {data.vehicles_count && (
Total Vehicles {data.vehicles_count}
)} {data.round_trip_duration_seconds && (
Round Trip {Math.floor(data.round_trip_duration_seconds / 60)}:{(data.round_trip_duration_seconds % 60).toString().padStart(2, '0')}
)}
)} {/* Companies & Model */} {(manufacturer || designer || model) && (
Companies & Model
{manufacturer && (
Manufacturer:{' '} {manufacturer}
)} {designer && (
Designer:{' '} {designer}
)} {model && (
Model:{' '} {model}
)}
)} {/* Dates */} {(data.opening_date || data.closing_date) && (
Dates
{data.opening_date && (
Opened:{' '}
)} {data.closing_date && (
Closed:{' '}
)}
)} {/* Description */} {data.description && (
Description
{data.description}
)} {/* Source */} {data.source_url && ( Source )} {/* Submission Notes */} {data.submission_notes && (
Submitter Notes
{data.submission_notes}
)} {/* Images Preview */} {(data.banner_image_url || data.card_image_url || data.image_url) && (
Images
{data.banner_image_url && (
Banner
Banner {data.banner_image_id && ( ID: {data.banner_image_id.slice(0, 8)}... )}
)} {data.card_image_url && (
Card
Card {data.card_image_id && ( ID: {data.card_image_id.slice(0, 8)}... )}
)} {data.image_url && !data.banner_image_url && !data.card_image_url && (
Ride
Legacy Image
)}
)}
); }