import { useState } from 'react'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import * as z from 'zod'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; import { Label } from '@/components/ui/label'; import { PhotoUpload } from '@/components/upload/PhotoUpload'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { DatePicker } from '@/components/ui/date-picker'; import { toast } from '@/hooks/use-toast'; import { Zap, Save, X } from 'lucide-react'; const rideSchema = z.object({ name: z.string().min(1, 'Ride name is required'), slug: z.string().min(1, 'Slug is required'), description: z.string().optional(), category: z.string().min(1, 'Category is required'), ride_sub_type: z.string().optional(), status: z.string().min(1, 'Status is required'), opening_date: z.string().optional(), closing_date: z.string().optional(), height_requirement: z.number().optional(), age_requirement: z.number().optional(), capacity_per_hour: z.number().optional(), duration_seconds: z.number().optional(), max_speed_kmh: z.number().optional(), max_height_meters: z.number().optional(), length_meters: z.number().optional(), inversions: z.number().optional(), // New roller coaster specific fields coaster_type: z.string().optional(), seating_type: z.string().optional(), intensity_level: z.string().optional(), drop_height_meters: z.number().optional(), max_g_force: z.number().optional(), former_names: z.string().optional(), coaster_stats: z.string().optional(), technical_specs: z.string().optional() }); type RideFormData = z.infer; interface RideFormProps { onSubmit: (data: RideFormData & { image_url?: string }) => Promise; onCancel?: () => void; initialData?: Partial; isEditing?: boolean; } const categories = [ 'roller_coaster', 'flat_ride', 'water_ride', 'dark_ride', 'kiddie_ride', 'transportation' ]; const statusOptions = [ 'Operating', 'Seasonal', 'Closed Temporarily', 'Closed Permanently', 'Under Construction', 'Planned', 'SBNO' // Standing But Not Operating ]; const coasterTypes = [ 'steel', 'wood', 'hybrid' ]; const seatingTypes = [ 'sit_down', 'stand_up', 'flying', 'inverted', 'floorless', 'suspended', 'wing', 'dive', 'spinning' ]; const intensityLevels = [ 'family', 'thrill', 'extreme' ]; export function RideForm({ onSubmit, onCancel, initialData, isEditing = false }: RideFormProps) { const [submitting, setSubmitting] = useState(false); const [rideImage, setRideImage] = useState(initialData?.image_url || ''); const { register, handleSubmit, setValue, watch, formState: { errors } } = useForm({ resolver: zodResolver(rideSchema), defaultValues: { name: initialData?.name || '', slug: initialData?.slug || '', description: initialData?.description || '', category: initialData?.category || '', ride_sub_type: initialData?.ride_sub_type || '', status: initialData?.status || 'Operating', opening_date: initialData?.opening_date || '', closing_date: initialData?.closing_date || '', height_requirement: initialData?.height_requirement || undefined, age_requirement: initialData?.age_requirement || undefined, capacity_per_hour: initialData?.capacity_per_hour || undefined, duration_seconds: initialData?.duration_seconds || undefined, max_speed_kmh: initialData?.max_speed_kmh || undefined, max_height_meters: initialData?.max_height_meters || undefined, length_meters: initialData?.length_meters || undefined, inversions: initialData?.inversions || undefined, coaster_type: initialData?.coaster_type || undefined, seating_type: initialData?.seating_type || undefined, intensity_level: initialData?.intensity_level || undefined, drop_height_meters: initialData?.drop_height_meters || undefined, max_g_force: initialData?.max_g_force || undefined, former_names: initialData?.former_names || '', coaster_stats: initialData?.coaster_stats || '', technical_specs: initialData?.technical_specs || '' } }); const selectedCategory = watch('category'); const generateSlug = (name: string) => { return name .toLowerCase() .replace(/[^a-z0-9\s-]/g, '') .replace(/\s+/g, '-') .replace(/-+/g, '-') .trim(); }; const handleNameChange = (e: React.ChangeEvent) => { const name = e.target.value; const slug = generateSlug(name); setValue('slug', slug); }; const handleFormSubmit = async (data: RideFormData) => { setSubmitting(true); try { await onSubmit({ ...data, image_url: rideImage || undefined }); toast({ title: isEditing ? "Ride Updated" : "Ride Created", description: isEditing ? "The ride information has been updated successfully." : "The new ride has been created successfully." }); } catch (error: any) { toast({ title: "Error", description: error.message || "Failed to save ride information.", variant: "destructive" }); } finally { setSubmitting(false); } }; return ( {isEditing ? 'Edit Ride' : 'Create New Ride'}
{/* Basic Information */}
{ register('name').onChange(e); handleNameChange(e); }} placeholder="Enter ride name" /> {errors.name && (

{errors.name.message}

)}
{errors.slug && (

{errors.slug.message}

)}
{/* Description */}